Sql Oracle对select查询使用了错误的索引?

Sql Oracle对select查询使用了错误的索引?,sql,oracle,indexing,Sql,Oracle,Indexing,因此,我有一个包含两个索引的表: 索引_1:列_A,列_B 索引2:A列、B列、C列 我正在运行select查询: select * from table Where (Column A, Column_B, Column_C) IN(('1','2','3'), ('4','5','6'),...); 在SQL developer中使用“解释计划”时。它似乎在使用第一个索引而不是第二个索引,尽管第二个索引与我的查询中的值匹配 为什么会这样?这是否妨碍了我的最佳性能?在我的评论中进行扩展,尽

因此,我有一个包含两个索引的表:

索引_1:列_A,列_B

索引2:A列、B列、C列

我正在运行select查询:

select * from table Where (Column A, Column_B, Column_C) 
IN(('1','2','3'), ('4','5','6'),...);
在SQL developer中使用“解释计划”时。它似乎在使用第一个索引而不是第二个索引,尽管第二个索引与我的查询中的值匹配


为什么会这样?这是否妨碍了我的最佳性能?

在我的评论中进行扩展,尽管我们无法在不了解数据或不了解实际计划的情况下分析Oracle的查询计划,但三列索引并不一定比两列索引更适合您的查询,至少在基表具有附加列的情况下是如此(您选择的)超出这三个

Oracle无论如何都需要读取基表才能获得其他列。假设
列C
中的值与
列A
列B
中的值没有太大的相关性,那么三列索引将比两列索引大得多。因此,使用两列索引可能需要总的来说,数据块更少,特别是如果该索引具有相对选择性的话


Oracle有一个非常好的查询计划器。如果它有好的表统计数据可以使用,那么它可能会选择一个好的计划。即使没有好的统计数据,对于像您这样简单的查询,它也可能会做得很好。

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

Oracle无论如何都需要读取基表才能获得其他列。假设
列C
中的值与
列A
列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


试图确保收集统计数据,但系统仍检测到
索引1
为最佳使用。

我也有类似问题,Oracle根据解释计划使用了一个包含2列的索引,而我的查询涉及从表中选择20列,以及包含5个值的where子句,如下所示:

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
是最好的使用方法。

我们不能不看计划或不了解任何数据就说。但是,如果Oracle对目标表有良好的统计数据,那么它可能会选择最有效的计划。这可能很容易依赖于两列索引在非常合理的情况下,三列索引要大得多。我们不能不看计划或不了解数据就说。但是,如果Oracle对目标表有良好的统计数据,那么它可能会选择最有效的计划。这可能很容易依赖于非常合理的两列索引t这三列索引要大得多。你需要将代码显示为代码而不是文本,这将产生更大的影响。你还应该为你的声明提供资源链接。这也是一个更混乱的解释。这是一个答案还是你在寻找答案?你需要将代码显示为代码而不是文本,这将产生更大的影响。你也需要应该为您的索赔提供资源链接。这也是一个更混乱的解释。这是一个答案还是您正在寻找答案?