2011-11-21 62 views
0

我在Oracle中建立索引时遇到问题。将试图用一个实例来解释我的问题,如下所示。错误索引由Oracle选择

我与列A,B,C,d 表TABLE1另一个表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 UNIQUE SCAN,索引跳跃式扫描

我想,当一列在综合指数由Oracle

跳过跳跃式扫描指

别人怎么样我没有主意!

+4

当涉及到使用索引时,不存在_right_或_wrong_。根据成本计算,Oracle选择最优化的执行计划。你最近是否更新过数据库统计信息?此外,我不明白你为什么有这么多的索引。如果使用IX_4和IY_2,那么所有可能受益于IX_1,IX_2或IY_2的查询都可以以非常相似的成本和执行计划执行。 – Codo

+0

谢谢科多。我没有创建这些索引。我们正在JAROSODS数据库上实施。他们有充足的索引。我试图模仿我的问题。另外我没有访问权限来更改这些索引。只是为了使用它们 – shanmugamgsn

+0

@Codo >>你的意思是说我们不能手动改变成本计算?你在这里的数据库统计数据是什么意思? – shanmugamgsn

回答

3

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

在你的情况下,为了连接表T1和T2,Oracle需要这些表中的所有行。阅读(全部)索引将是一个不切实际的操作,增加了不必要的成本。

UPDATE:向前迈进了一步:如果您运行:

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

甲骨文可能会使用索引(IX2,IY2),因为它不需要读取表什么,因为值T1 .B,T2.B,在索引中为

+0

但我能知道索引范围扫描,索引独特扫描,索引跳过扫描有什么区别 – shanmugamgsn

+0

是弗罗林你说的是对的!通过选择查询中的选定列,我可能会丢失COST差异。谢谢...对不起,如果我错了,为什么我的费用更改,如果我添加另一列**选择查询**不在索引 – shanmugamgsn

+0

在第62页,你可以找到解释:http://www.google.ro /url?sa=t&rct=j&q=oracle+database+concepts+11g+release+2+pdf&source=web&cd=1&ved=0CBsQFjAA&url=http%3A%2F%2Fdownload.oracle.com%2Fdocs%2Fcd%2FE11882_01%2Fserver.112 %2Fe25789.pdf&EI = DG7KTtO-H6Sk4gT7t7Rl与USG = AFQjCNFC2IF4gfuwZuCviTf5XzbIw7FwvA&SIG2 = M1xI2YxRwb0KM8yuoYFRUQ –