【问题标题】:Oracle SQL - check missing indexes on SQL queryOracle SQL - 检查 SQL 查询中缺失的索引
【发布时间】:2018-02-07 02:41:56
【问题描述】:

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

对于表中的检查索引,我使用语法:

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';

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

谢谢!

【问题讨论】:

  • 你在谈论解释计划?

标签: sql oracle indexing plsql


【解决方案1】:

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

启用自动索引

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');

禁用自动索引

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','OFF');

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

【讨论】:

  • 听起来是个有趣的选择。我想了解建议新索引的准确度。
  • 给予赏金和积分,嘿?没有人喜欢我下面的回答也有效:)?
【解决方案2】:

我为索引建议(以及许多其他改进建议)找到的可靠方法是 OEM(Oracle 企业管理器)中的 SQL Tuning Advisor。它有时会为您的语句找到更好的计划,并将其添加到 SQL 配置文件中,您可以在 dba_sql_profiles 下查看。

SQL Advisor 将以这种格式为您提供索引建议:

考虑运行 Access Advisor 以改进物理架构 设计或创建推荐的索引。

<schema.table>(field list)

创建推荐的索引显着提高了执行 本声明的计划。

您必须先运行您的 SQL,然后在 OEM 中您的实例的 Top Activity 下找到它,或者通过 SQL ID 搜索它。

【讨论】:

    【解决方案3】:

    这是一个很好的资源:@​​987654321@

    ACCEPT SCHEMA_NAME PROMPT 'Choose the schema to analyze:'
    
    select * from (
      select 'the column ' || c.name || ' of the table ' || us.name || '.' || o.name || ' was used ' || u.equality_preds || ' times in an equality predicate and ' || u.equijoin_preds || ' times in an equijoin predicate and is not indexed' as colum_to_index
      from sys.col_usage$ u,
           sys.obj$ o,
           sys.col$ c,
           sys.user$ us
      where u.obj# = o.obj#
      and   u.obj# = c.obj#
      and   us.user# = o.owner#
      and   u.intcol# = c.col#
      and   us.name='&SCHEMA_NAME'
      and   c.name not in (select column_name from dba_ind_columns where index_owner ='&SCHEMA_NAME')
      and   (u.equality_preds > 100 OR u.equijoin_preds > 100)
      order by u.equality_preds+u.equijoin_preds desc)
    WHERE rownum <11;
    

    【讨论】:

      【解决方案4】:

      不是真的。检查execution plan 将告诉您优化器将使用哪些索引(如果有);但如果计划没有显示索引,那可能就是这样

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

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

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

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

      【讨论】:

      • 嗨,我在下面添加了答案
      • 有时全表扫描实际上是最好的计划。索引不是灵丹妙药。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多