Rollback Segment(回滾段)是交易一致性與並發控制核心。本文涵蓋概念、爭用診斷、減少使用量、小回滾段風險、9i自動Undo管理五大維度。
-- 檢查Undo等待統計
SELECT class, count FROM v$waitstat WHERE class LIKE '%undo%';
-- 計算等待率
SELECT SUM(waits)*100/SUM(gets) "Ratio", SUM(waits) "Waits", SUM(gets) "Gets" FROM v$rollstat;
判準:任何等待類型計數/總請求數 > 1%,或v$rollstat.waits、v$waitstat undo header、v$system_event undo segment tx slot大於0,均表示Header爭用,需新增Rollback Segment。
TRUNCATE替代DELETE。COMMIT=Y、BUFFER設定批次大小CONSISTENT=NROWS設定提交間隔| 參數 | 說明 |
|---|---|
UNDO_MANAGEMENT | AUTO啟用自動管理,MANUAL手動 |
UNDO_RETENTION | 回滾資料保留秒數 |
UNDO_TABLESPACE | 指定Undo表空間 |
Undo表空間可切換,同一時刻僅一個Active。非Active可刪除,但若有查詢引用其中已提交交易會報錯。
Undo Space = (undo_retention * (undo blocks per second * db_block_size)) + db_block_size
SQL自動計算:
SELECT (rd*(ups*overhead)+overhead) "bytes"
FROM (SELECT value rd FROM v$parameter WHERE name='undo_retention'),
(SELECT SUM(undoblks)/SUM((end_time-begin_time)*10800) ups FROM v$undostat),
(SELECT value overhead FROM v$parameter WHERE name='db_block_size');
採用UAM可大幅降低DBA管理負擔,建議新系統預設啟用。