Oracle SQL - 检查 SQL 查询中缺失的索引

Cat*_*lin 4 sql oracle indexing plsql

我需要检查查询中是否缺少一个或多个索引。

为了检查表中的索引,我使用语法:

SELECT index_name
     , column_position
     , column_name
  FROM user_ind_columns
 WHERE table_name = 'table_name'
 ORDER BY index_name, COLUMN_POSITION;

 SELECT index_name 
 FROM user_indexes
 WHERE table_name = 'table_name';
Run Code Online (Sandbox Code Playgroud)

是否可以使用程序或 SQL 脚本自动查找查询中是否缺少索引并显示它以创建它们?

谢谢!

Wil*_*son 6

并不真地。检查执行计划将告诉您优化器将使用哪些索引(如果有);但如果计划显示没有索引,则可能是这样

  1. 没有索引。
  2. 有索引,但它们不能用于特定查询。
  3. 有些索引在技术上是可以使用的,但优化器计算出它们不会提高性能。

在#3 的情况下,它总是有可能是错误的(例如,由于不正确的统计数据或查询超出了优化器准确建模的能力)。如果您正在寻找这种情况,则没有简单的方法可以检测到它。

您可以查看dbms_sqltune自动调整建议。它通常会告诉您收集统计信息,或者有时会建议 SQL 配置文件或新索引。您可以从企业管理器或脚本中调用它:

http://www.williamrobertson.net/documents/automated-sql-tuning-advice.html http://www.williamrobertson.net/documents/automated-sql-tuning-advice-sqlid.html


小智 5

使用 Oracle 自治数据库,您可以启用自动索引。自动索引可自动执行索引管理任务,并且无需根据您的工作负载模式适当创建、维护和停用/不使用索引的知识和专业知识。

启用自动索引

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
Run Code Online (Sandbox Code Playgroud)

禁用自动索引

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','OFF');
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅 Oracle 文档中的自动索引。