如果WHERE子句包含未编制索引的列,则使用索引

时间:2018-06-06 09:25:23

标签: sql oracle query-performance database-indexes

我正在使用包含以下索引的表:

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记录。

1 个答案:

答案 0 :(得分:0)

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

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

要查看查询中使用了哪些索引,请查看执行计划,您可以通过点击F10在SQL Developer中看到该计划。

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

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

SELECT table_name, last_analyzed FROM USER_TABLES;

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