【发布时间】:2012-01-02 22:02:42
【问题描述】:
我在 Oracle 中建立索引时遇到问题。将尝试用一个实例来解释我的问题,如下所示。
我有一个包含 A、B、C、D 列的表 TABLE1 另一个包含 A、B、C、E、F、H 列的表 TABLE2
我已经为 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 在复合索引中跳过一列时
我不知道的其他人呢!
【问题讨论】:
-
在使用索引方面没有正确或错误。 Oracle 根据其成本计算选择最优的执行计划。您最近是否更新了数据库统计信息?此外,我不明白为什么你有这么多索引。如果改为使用 IX_4 和 IY_2,则所有可能受益于 IX_1、IX_2 或 IY_2 的查询都可以以非常相似的成本和执行计划执行。
-
谢谢科多。我没有创建这些索引。我们正在 JAROSODS 数据库上实现。他们有足够的索引。我试图模仿我的问题。我也无权更改这些索引。只是为了使用它们
-
@Codo >> 你的意思是说我们不能手动更改成本计算?还有你所说的数据库统计是什么意思?
-
Oracle 要计算查询计划的成本,它需要知道一张表有多少行,某些值的频率等。这些统计数据需要使用 DBMS_STATS 包定期计算。否则 Oracle 会使用低效的执行计划。而且我不明白您为什么要更改成本计算?那有什么好处呢?你问这个问题的目的是什么?您发布的查询是否存在性能问题?
-
对不起 Codo,我想在解释我的问题时有点含糊。实际上,在我的查询中,我使用的 where 子句与索引中的完全一样。但是没有选择该索引,它正在选择其他索引并且执行 INDEX SKIP SCAN (Cost is too high) 。但如果我按照 Florin Ghita 的建议去做,成本就会降低很多。抱歉,实际上我的意思是说我想降低成本而不是改变成本
标签: oracle oracle11g indexing oracle10g