sql之Oracle 索引排序顺序和连接
我有 2 个表,其中包含数百万行的索引。我希望将其中一个索引转换为 DESC 顺序以优化某些操作。但是,这会影响加入速度或其他优化吗?
例如:
Table A:<br/> a_id (pk)<br/>
Table B:<br/> b_id (pk)<br/> a_id (fk)
如果 A.a_id 存储为 DESC 而 B.a_id 存储为 ASC,我会遇到任何问题或联接速度慢吗? oracle 是否能够使用索引进行连接,即使它们具有不同的排序顺序?我是否还必须制作 B.a_id DESC 或创建第二个索引 DESC ?显然,我想尝试一个简单的实验,但我没有 DBA 访问权限或备用 oracle 设置。
请您参考如下方法:
Will oracle be able to use the indexes for joining even though they have different sort orders?
索引不用于“连接”。它们用于访问数据。然后将这样创建的行源连接起来。我能想到索引的排序顺序会对连接产生任何影响的唯一原因是,如果发生合并连接并且索引被用于避免排序。在这种情况下,更改为降序索引的影响可能是数据被访问后需要在内存中进行排序;或者它可能不会,如果优化器足够智能,可以在进行合并时以相反的顺序简单地遍历该数据。
如果您的查询的执行计划依赖于使用 A.A_ID 上的索引来按升序获取数据(出于合并连接的目的或满足您请求的结果排序),则将索引更改为降序可能会产生影响。
编辑:刚刚对一些示例数据进行了快速测试。优化器似乎确实能够合并以相反顺序排序的行源,而无需求助于它们中的任何一个。因此,在最明显的层面上,一个索引上升而另一个索引下降应该不会导致严重的性能问题。然而,看起来降序索引确实会对执行计划产生其他影响——在我的例子中,升序索引用于快速全扫描,而降序索引用于范围扫描。这可能会导致查询性能发生变化(好或坏),但唯一确定的方法是对其进行测试。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。