MONITORING USAGE)過多索引拖慢 DML (INSERT/UPDATE/DELETE 需同步維護所有索引),但手動識別極難。
SPOOL enable_mon.sql
SELECT 'ALTER INDEX ' || owner || '.' || index_name || ' MONITORING USAGE;'
FROM dba_indexes
WHERE owner NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP');
SPOOL OFF
@enable_mon.sql
SELECT index_name, table_name, monitoring, used,
start_monitoring, end_monitoring
FROM v$object_usage
WHERE used = 'NO'
ORDER BY table_name, index_name;
V$SESSION_LONGOPS)CREATE INDEX)INSERT /*+ APPEND */, CTAS)MOVE, SPLIT, EXCHANGE)
-- 先取得目標 Session SID
SELECT sid, serial#, username, sql_id FROM v$session WHERE username = 'APP_USER' AND status = 'ACTIVE';
-- 查詢進度 (以 SID=123 為例)
SELECT sid,
opname,
target,
sofar,
totalwork,
ROUND(sofar/totalwork*100,2) AS pct_done,
elapsed_seconds,
time_remaining,
start_time,
last_update_time,
message
FROM v$session_longops
WHERE sid = 123
AND totalwork > 0
ORDER BY start_time;
SID OPNAME TARGET SOFAR TOTALWORK PCT_DONE ELAPSED REMAINING MESSAGE
123 Table Scan SALES.PK_SALES_ID 732 243260 0.30% 45 14950 Table Scan: SALES.PK_SALES_ID: 732 out of 243260 Blocks done
**注意**:TIME_REMAINING 為估算值,受 I/O 波動影響大,參考即可。
SET TRANSACTION USE ROLLBACK SEGMENT 解決 ORA-01555ORA-01555: snapshot too old — 查詢需要的 Undo 已被覆寫。**原因**:長查詢 + 高併發 DML + **Undo 表空間過小 / UNDO_RETENTION 過短 / 自動管理下保證不足**。
-- 僅限手動 Undo 管理模式 (9i- 或 手動模式)
SET TRANSACTION USE ROLLBACK SEGMENT rb_large;
DELETE FROM huge_table WHERE created < SYSDATE - 365;
COMMIT;
-- 提交後自動釋放指定
ALTER TABLESPACE undotbs ADD DATAFILE ... SIZE 10G AUTOEXTEND ON MAXSIZE 50G;ALTER SYSTEM SET UNDO_RETENTION = 3600 SCOPE=BOTH; (秒,視最長查詢而定)。ALTER TABLESPACE undotbs RETENTION GUARANTEE; — **犧牲 DML 失敗換取查詢不報 1555**,謹慎用於報表專用庫。三大實用技巧:**索引監控清理無用索引**、**V$SESSION_LONGOPS 可視化長操作進度**、**Undo 管理根治 ORA-01555**。將前兩者納入 **例行巡檢腳本 (每週/每月)**,Undo 參數納入 **容量規劃模型**,讓資料庫健康度可量化、可預測。