Oracle选择了错误的索引

时间:2011-11-21 11:41:20

标签: oracle oracle11g indexing oracle10g

我在Oracle中编制索引时遇到问题。将尝试用如下实例解释我的问题。

我有一个表TABLE1,其中包含A,B,C,D列 另一个表TABLE2,列A,B,C,E,F,H

我已经为TABLE1创建了索引

IX_1 A
IX_2 A,B
IX_3 A,C
IX_4 A,B,C

我已经为TABLE1创建了索引

IY_1 A,B,C
IY_2 A

当我提出与此类似的查询时

SELECT * FROM TABLE1 T1,TABLE2 T2
WHERE T1.A=T2.A

当我给出解释计划时,我得到的不是IX_1,也不是IY_2

采取IX_4或IY_1

为什么这不是正确的指数?

编辑:

任何人都可以帮我了解INDEX RANGE SCAN,INDEX UNIQUE SCAN,INDEX SKIP SCAN之间的区别

我猜SKIP SCAN意味着在Oracle的Composite Index中跳过一列

其他我不知道的事情!

1 个答案:

答案 0 :(得分:3)

索引的最大好处是您可以从表格中选择几行而不扫描整个表格。 如果你要求太多行(比方说30% - 取决于很多东西),引擎会更喜欢扫描整个表格中的那些行。 那是因为使用索引读取行会产生开销:读取一些索引块,然后读取表块。

在您的情况下,为了连接表T1和T2,Oracle需要来自这些表的所有行。阅读(完整)索引将是一个不完整的操作,增加了不必要的成本。

更新:向前迈出一步:如果您运行:

SELECT T1.B, T2.B FROM TABLE1 T1,TABLE2 T2
WHERE T1.A=T2.A

Oracle可能会使用索引(IX2,IY2),因为它不需要从表中读取任何内容,因为索引中的值T1.B,T2.B,