所以我有一个带有两个索引的表:
索引_1:Column_A,Column_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个值,如下所示: