确保为查询中涉及的列创建了索引。例如,假如你常常需要按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、统计信息不正确
错误信息:
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());