Oracle Index Sort Order and Joining

时间:2010-12-06 15:03:25

标签: sql oracle

我有两个带有索引的数百万行的表。我希望将其中一个索引转换为DESC顺序以优化某些操作。但是,这会影响加入速度还是其他优化?

例如:

Table A:
a_id (pk)

Table B:
b_id (pk)
a_id (fk)

如果A.a_id存储为DESC并且存储了B.a_id,ASC会在连接时遇到任何问题或缓慢吗? oracle是否能够使用索引进行加入,即使它们有不同的排序顺序?我是否必须制作B.a_id DESC或创建第二个DESC索引?显然我想尝试一个简单的实验,但我没有DBA访问权限或备用oracle设置。

6 个答案:

答案 0 :(得分:4)

  

oracle是否能够使用索引   加入,即使他们有   不同的排序顺序?

索引不用于“加入”。他们习惯于访问数据。然后连接如此创建的行源。我可以想到索引的排序顺序对加入有任何影响的唯一原因是,如果发生合并连接并且正在使用索引来避免排序。在这种情况下,更改为降序索引的影响可能是数据在访问后需要在内存中排序;或者它可能不会,如果优化器足够智能,只需在进行合并时以相反的顺序遍历该数据。

如果您的查询的执行计划依赖于使用A.A_ID上的索引来按升序获取数据(为了合并连接或满足您请求的结果排序),则将索引更改为降序可能会产生影响。

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

答案 1 :(得分:2)

Oracle将索引实现为双向链表,因此无论是为单个列指定ASC还是DESC索引都没有区别。

DESC索引是一种特殊情况,有助于获得多列索引,例如:如果我有一个经常通过colA ASC,colB DESC命令的查询,那么我可能决定在(colA,colB DESC)上添加索引以避免排序。

答案 2 :(得分:0)

我不确定我会得到你想要的东西 - 你不能以降序或升序“存储”。您可以使用ORDER BY子句获取查询结果并对其进行排序,该子句将按升序或降序对结果集进行排序。

无法保证您按升序或降序插入任何数据。

因此,插入它的“顺序”与性能无关,因为没有顺序

答案 3 :(得分:0)

没有开发和测试系统开发? 你的答案是用一个开发。 Oracle提供所有平台,只需安装,添加数据,完成您的工作。

对你来说,只是危险地生活并做指数改变,谁在乎发生了什么。抓住那个黄铜戒指。所以你错过了。你不会丢失任何数据。

答案 4 :(得分:0)

一般来说,索引可以按asc / desc顺序扫描,因为索引结构中的2个指针足以识别叶块和相应的块,同时根据asc / desc顺序进行扫描而不在内存中进行排序。

但是,如果我们使用desc列定义创建索引,其结构将远大于普通索引,因为普通索引具有90-10个分割(递增行ID),其中desc索引将是50-50分割并且将导致未使用的空间和重建的候选者,这将需要额外的维护和开销。

当你有一个多列索引时,DESC索引会很有用,其中asc中需要一列,而desc中另一列需要在内存中排序。

答案 5 :(得分:-1)

早期优化是浪费时间。离开这个问题然后做下一件事。当这个表中有1亿行时,更改索引并测试会发生什么,直到那时你的十行数据不值得“优化”。