sql - Oracle 索引排序顺序和连接

标签 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 上的索引来按升序获取数据(出于合并连接的目的或满足您请求的结果排序),则将索引更改为降序可能会产生影响。

编辑:刚刚对一些示例数据进行了快速测试。优化器似乎确实能够合并以相反顺序排序的行源,而无需求助于它们中的任何一个。因此,在最明显的层面上,一个索引上升而另一个索引下降应该不会导致严重的性能问题。然而,看起来降序索引确实会对执行计划产生其他影响——在我的例子中,升序索引用于快速全扫描,而降序索引用于范围扫描。这可能会导致查询性能发生变化(好或坏),但唯一确定的方法是对其进行测试。

关于sql - Oracle 索引排序顺序和连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4367703/

相关文章:

sql - Oracle SQL 条件求和

python - sqlalchemy 1.1.10 oracle 连接错误

oracle - 如何获得 DBTIMEZONE 和 SESSIONTIMEZONE 之间的数值差异?

sql - 如何格式化 SQL 表查询?

mysql - 使用 Json_value 的 T-sql 语法不正确

mysql - 目标表不可更新

oracle - 如何获取oracle中不同表的前十行?

c# - Singleton 上的 StackOverflowException

java - 基于外键的增量字段(JPA、Hibernate、Oracle DB)

mysql - 连接 4 个 SQL 表,3 个源 1 'container'