Oracle使用错误的索引进行选择查询?

问题描述 投票:0回答:2

所以我有一个带有两个索引的表:

索引_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”时。尽管第二个匹配我查询中的值,但它似乎正在使用第一个索引而不是第二个索引?

为什么?并阻碍了我的最佳表现吗?

sql oracle indexing
2个回答
3
投票

扩展我的评论,尽管我们无法在不了解数据或查看实际计划的情况下分析Oracle的查询计划,但三列索引不一定比两列索引更适合您的查询,至少如果基本表中有三列之外的其他列(您正在选择)。

Oracle无论如何都需要读取基表来获取其他列。假设column_C中的值与column_Acolumn_B中的值不太相关,则三栏索引将比两栏索引大得多。因此,使用双列索引可能会涉及整体上读取较少的块,尤其是在该索引具有相对选择性的情况下。]

Oracle有一个非常好的查询计划器。如果它具有良好的表统计信息,则可能选择了一个好的计划。即使没有良好的统计信息,它也可能对像您这样简单的查询做得很好。


0
投票

我有类似的问题,Oracle按照解释计划使用具有2列的索引,而我的查询涉及从表中选择20列,而where子句具有5个值,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.