如果 WHERE 子句包含未索引的列,是不是使用索引

Posted

技术标签:

【中文标题】如果 WHERE 子句包含未索引的列,是不是使用索引【英文标题】:Are indexes used if the WHERE clause contains unindexed columns如果 WHERE 子句包含未索引的列,是否使用索引 【发布时间】:2018-06-06 09:25:23 【问题描述】:

我正在使用具有以下索引的表:

ind1 : column A,B,C,D
ind2 : column G
ind3 : column C
ind4 : column F
ind5 : column D
ind6 : column E

在我的查询中,我使用以下选择标准:

SELECT * FROM table WHERE
    A=a
AND B=b
AND C=c
AND D=d
AND E=e
AND F=f
AND H=h  (H does not have an index)  

我的问题是是否使用了表的索引,如果在这个查询中增强了性能,请注意该表总共包含12列和32M条记录。

【问题讨论】:

你试过查看查询的执行计划吗?它将解决您对正在使用或不使用哪些索引的疑虑...... 如果 Oracle 认为需要使用索引,将使用它们。在这种情况下,我很确定,正在使用索引。你应该尝试做explan plan for select * from ...your complete query...select * from table(dbms_xplan.display) 你会得到检查正在使用的索引的计划 【参考方案1】:

是的,查询几乎肯定会使用其中一个索引来预先选择哪些行可以满足至少一些条件。要检查 WHERE 子句对于未索引的列(如您的列 H)是否为真,Oracle 只需检查表本身。由于索引指向表的正确物理位置,这通常非常快。

使用哪个索引取决于许多因素,例如表的大小、索引的大小、表列的唯一性、索引的唯一性、列值的数据分布等。

要查看查询中使用了哪些索引,请查看执行计划,例如在 SQL Developer 中按 F10 即可查看。

编辑:根据我的经验,Oracle 选择最有希望的索引(这将最大程度地减少行数),然后通过这样的表查找检查 WHERE 子句中的所有列。

还请确保表格的统计信息是最新的。如有疑问,请与

SELECT table_name, last_analyzed FROM USER_TABLES;

如果 last_analyzed 为空或旧日期,请搜索 DBMS_STATS.GATHER_TABLE_STATS 刷新统计信息。

【讨论】:

以上是关于如果 WHERE 子句包含未索引的列,是不是使用索引的主要内容,如果未能解决你的问题,请参考以下文章

oracle用WHERE替代ORDER BY

Oracle 索引

sql优化

如何查看oracle失效的索引

C#笔记

具有重复值的列上的数据库索引