Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果WHERE子句包含未索引的列,是否使用索引_Sql_Oracle_Query Performance_Database Indexes - Fatal编程技术网

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

Sql 如果WHERE子句包含未索引的列,是否使用索引,sql,oracle,query-performance,database-indexes,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) 我

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

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

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

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

要查看查询中使用了哪些索引,请查看执行计划,例如在SQLDeveloper中点击F10可以看到执行计划

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

还请确保该表的统计数据是最新的。如有疑问,请咨询

SELECT table_name, last_analyzed FROM USER_TABLES;

如果上次分析的数据为空或为旧数据,请搜索DBMS_STATS.GATHER_TABLE_STATS以刷新统计数据。

是否尝试查看查询的执行计划?它将解决您对正在使用或未使用的索引的疑问…如果Oracle认为需要使用索引,将使用索引。在这种情况下,我非常确定,索引正在被使用。您应该尝试执行
explan计划,以便从您的完整查询中选择*。
select*from表(dbms\u xplan.display)
您将获得检查正在使用的索引的计划