首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Rollback/Undo Segment 優化:競爭診斷、空間節省與 9i 自動管理

     編輯:Oracle 資料庫基礎

Rollback Segment 運作機制

  • 事務循環使用 Extent,當前 Extent 滿則切換下一個。
  • 多事務可同時寫同一 Extent,但單區塊僅屬於一個事務。
  • Header 區塊含 Transaction Table,記錄事務狀態,頻繁修改,宜長駐 Buffer Cache。
  • 為減少 Header 爭用:手工模式建多個 Rollback Segment,或啟用 9i 自動 Undo 管理。

Header 爭用診斷 (手工模式)

-- 等待統計
SELECT class, count FROM v$waitstat WHERE class LIKE '%undo%';

-- 總請求數
SELECT SUM(value) FROM v$sysstat WHERE name IN ('db block gets','consistent gets');

-- 任一類型等待/總請求 > 1% 即有爭用

-- 或彙總視圖
SELECT SUM(waits)*100/SUM(gets) "Ratio%", SUM(waits) "Waits", SUM(gets) "Gets"
FROM v$rollstat;

若 Ratio > 1%,建議增加 Rollback Segment。

直接證據:V$ROLLSTAT.WAITS、V$WAITSTAT undo header、V$SYSTEM_EVENT undo segment tx slot 計數 > 0。

減少 Undo 產生量

  1. 全表清空用 TRUNCATE 替代 DELETE。
  2. 應用層規律提交,避免長事務。
  3. 工具參數優化:
    • Import: COMMIT=Y + BUFFER 控制批次。
    • Export: CONSISTENT=N (非一致性讀加快、減少 Undo)。
    • SQL*Loader: ROWS=n 設定提交頻率。

小 Rollback Segment 潛在問題

  • 事務因空間不足失敗 (ORA-01562 / ORA-01628)。
  • Snapshot Too Old (ORA-01555) 三大成因:
    1. ITL 中 SCN 被沖刷,區塊 SCN 超過舊事務 SCN。
    2. Rollback Header Transaction Slot 被重用。
    3. Undo 資料已被覆寫。

9i 自動 Undo 管理 (AUM)

  • 建庫時可建立,或後續獨立建立並 ALTER SYSTEM SET UNDO_TABLESPACE = ... 切換 (同一時刻僅一個 ACTIVE)。
  • 非 ACTIVE Undo 表空間可刪除;若有查詢引用已提交事務會報錯。

Undo 表空間大小估算

Undo Space = (Undo_Retention * (Undo_Blocks_Per_Sec * 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');
  • rd:保留秒數;ups:每秒 Undo 區塊數;overhead:區塊大小 (含 Header 開銷)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數說明
UNDO_MANAGEMENTAUTO (自動) / MANUAL (手工)
UNDO_RETENTIONUndo 保留秒數 (目標值,非硬性保證)
UNDO_TABLESPACE指定作用中 Undo 表空間