[英]Oracle using wrong index for select query?
所以我有一个有两个索引的表:
索引_1:列_A、列_B
索引_2:A 列、B 列、C 列
我正在运行一个选择查询:
select * from table Where (Column A, Column_B, Column_C)
IN(('1','2','3'), ('4','5','6'),...);
在 SQL 开发人员中使用“EXPLAIN PLAN for”时。 尽管第二个与我的查询中的值匹配,但它似乎正在使用第一个索引而不是第二个索引?
为什么是这样? 它是否阻碍了我的最佳表现?
扩展我的评论,虽然我们无法在不了解数据或查看实际计划的情况下分析 Oracle 的查询计划,但三列索引不一定比两列索引更适合您的查询,至少在除了这三列之外,基表还有其他列(您正在选择)。
Oracle 无论如何都需要读取基表以获取其他列。 假设column_C
中的值与column_A
和column_B
的值不太相关,那么三列索引将比两列索引大很多。 因此,使用两列索引可能涉及读取较少的块,尤其是在该索引相对选择性的情况下。
Oracle 有一个非常好的查询计划器。 如果它有很好的表统计数据,那么它可能是在选择一个好的计划。 即使没有良好的统计数据,它也可能对像您这样简单的查询做得很好。
我有类似的问题,Oracle 根据解释计划使用 2 列的索引,而我的查询涉及从表中选择 20 列,where 子句具有 5 个值,如下所示:
from tab1
where Col1= 'A'
and col2 = 'b'
and col3 = 'c'
and col4 = 'd'
and col5 >= 10
Index1: col1, col2
Index2: col1, col2, col3, col4, col5
如果我添加了使用index2
的提示,那么查询的执行速度比使用index1
快得多……可以做些什么让 Oracle 选择index2
?
试图确保收集统计信息,但系统仍将index1
检测为最佳使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.