我在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中跳过一列
其他我不知道的事情!
答案 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, 。