簡體   English   中英

Oracle SQL - 檢查 SQL 查詢中缺少的索引

[英]Oracle SQL - check missing indexes on SQL query

我需要檢查查詢中是否缺少索引或索引。

對於表中的檢查索引,我使用語法:

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 腳本自動查找查詢中是否缺少索引並顯示它以創建它們?

謝謝!

並不是的。 檢查執行計划將告訴您優化器將使用哪些索引(如果有); 但是,如果計划未顯示任何索引,則可能是

  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

這是一個很好的資源: https : //www.dba-scripts.com/scripts/diagnostic-and-tuning/troubleshooting/find-missing-index/

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;

我為索引建議(以及許多其他改進建議)找到的可靠方法是 OEM (Oracle Enterprise Manager) 中的 SQL Tuning Advisor。 它有時會為您的語句找到更好的計划,並將其添加到 SQL 配置文件中,您可以在dba_sql_profiles下檢查該配置文件。

SQL Advisor 將以這種格式為您提供索引建議:

考慮運行 Access Advisor 以改進物理架構設計或創建推薦的索引。

 <schema.table>(field list)

創建推薦索引顯着改善了該語句的執行計划。

您必須先運行您的 SQL,然后在您實例的 Top Activity 下的 OEM 中找到它,或者通過 SQL ID 搜索它。

使用 Oracle 自治數據庫,您可以啟用自動索引。 自動索引可自動執行索引管理任務,並且無需根據您的工作負載模式適當地創建、維護和停用/不使用索引方面的知識和專業知識。

啟用自動索引

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

禁用自動索引

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

有關更多詳細信息,請參閱 Oracle 文檔中的自動索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM