所以我有一个包含两个索引的表:
Index_1:Column_A,Column_B
Index_2:A栏,Column_B,Column_C
我正在运行一个选择查询:
select * from table Where (Column A, Column_B, Column_C)
IN(('1','2','3'), ('4','5','6'),...);
使用" EXPLAIN PLAN for"在SQL开发人员中。它似乎是使用第一个索引而不是第二个,尽管第二个匹配我的查询中的值?
这是为什么?它是否阻碍了我的最佳表现?
答案 0 :(得分:3)
扩展我的评论,虽然我们无法在不了解数据或查看实际计划的情况下分析Oracle的查询计划,但是三列索引不一定比双列索引更适合您的查询,至少如果基表有超过这三个的其他列(你选择的话)。
Oracle无论如何都需要读取基表来获取其他列。假设column_C
中的值与column_A
和column_B
中的值不太相关,则三列索引将比两列索引大很多。因此,使用双列索引可能涉及总体上读取较少的块,特别是如果该索引具有相对选择性的话。
Oracle有一个非常好的查询规划器。如果它具有良好的表统计数据,则可能选择一个好的计划。即使没有良好的统计数据,它也可能对您的查询做得很好。
答案 1 :(得分:0)
我有类似的问题,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
检测为最佳使用方式。