繁体   English   中英

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

[英]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_Acolumn_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM