?
1. 索引未被創建或未正確創建
確保為查詢中涉及的列創建了索引。例如,如果你經常需要按column_name列進行查詢,確保已經為該列創建了索引,索引創建語句
CREATE INDEX idx_column_name ON table_name(column_name);
2、索引不可用
原因:索引可能被標記為不可用(UNUSABLE)通常是由于索引重建失敗或數據導入操作導致的。
解決方法:檢查索引狀態并重建索引
檢查索引狀態
SELECT INDEX_NAME, STATUS FROM USER_INDEXES WHERE TABLE_NAME = 'TABLE_NAME';?
如果索引不可用,重建索引
ALTER INDEX INDEX_NAME REBUILD;
3、統計信息不準確
原因:
Oracle 優化器依賴統計信息來決定執行計劃。如果表的統計信息不準確或過時,優化器可能會錯誤地選擇不使用索引。
所以創建索引并且執行語句沒有問題,則 可以使用DBMS_STATS包來收集最新的統計信息:
解決方法: ?
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME');
EXEC DBMS_STATS.GATHER_TABLE_STATS('SYMDR', 'LAB_REPORT_INFO');
4、如果收集最新的統計信息執行報錯
錯誤信息:
ORA-20005: object statistics are locked (stattype = ALL) 則看是否有死鎖
SELECT s.sid, s.serial#, l.object_id, o.object_name, l.session_id blocking_sid
FROM v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid
WHERE o.object_type = 'LAB_REPORT_INFO';
5、終止會話
如果找到死鎖可以使用如下命令終止會話
ALTER SYSTEM KILL SESSION 'sid,serial#';
?6、強制更新統計信息
如果確定沒有其他會話正在使用統計信息,或者已經終止了阻塞會話,可以嘗試強制更新統計信息:
BEGIN
? DBMS_STATS.GATHER_TABLE_STATS(
? ? ownname ? ? ? => 'OWNER',
? ? tabname ? ? ? => 'TABLE_NAME',
? ? estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
? ? method_opt ? ?=> 'FOR ALL COLUMNS SIZE AUTO',
? ? cascade ? ? ? => TRUE,
? ? force ? ? ? ? => TRUE);
END;
/
BEGIN
? DBMS_STATS.GATHER_TABLE_STATS(
? ? ownname ? ? ? => 'SYMDR',
? ? tabname ? ? ? => 'LAB_REPORT_INFO',
? ? estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
? ? method_opt ? ?=> 'FOR ALL COLUMNS SIZE AUTO',
? ? cascade ? ? ? => TRUE,
? ? force ? ? ? ? => TRUE);
END;
/
7、 檢查執行計劃
使用 EXPLAIN PLAN 或 DBMS_XPLAN 查看查詢的執行計劃,了解優化器為何選擇不使用索引:?
EXPLAIN PLAN FOR SELECT * FROM TABLE_NAME WHERE COLUMN_NAME = 'VALUE';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);EXPLAIN PLAN FOR
select * from lab_report_info where org_code='XX' ? and request_no='XX' ? ? ?and local_id='XX' ;?
SELECT * FROM table(DBMS_XPLAN.DISPLAY());