Oracle 10g 引入了 In-Memory Undo (IMU) 與 Private Redo Strand 技術,旨在減少 Redo 生成量與 Latch 競爭,提升高併發下的事務處理性能。本文結合圖解與動態視圖查詢,深入剖析這兩大機制的運作原理。

IMU 允許事務在提交前將 Undo 記錄暫存在私有內存中,僅在提交時批量寫入公共 Undo Segment,大幅降低 Undo Segment Header 的 Latch 爭用。可通過 V$SYSSTAT 觀察 IMU 相關統計:
SELECT * FROM v$sysstat WHERE name LIKE '%IMU%';
關鍵統計項含義:

每個事務分配專屬的 Redo Strand,避免多事務並發寫入公共 Redo Buffer 時的 Latch 競爭。提交時再將 Private Strand 內容快速拷貝到公共 Redo Buffer。
SELECT s.username, u.name
FROM v$transaction t, v$rollstat r, v$rollname u, v$session s
WHERE s.taddr = t.addr
AND t.xidusn = r.usn
AND r.usn = u.usn
ORDER BY s.username;
SELECT usn, xacts, rssize/1024/1024/1024, hwmsize/1024/1024/1024, shrinks
FROM v$rollstat ORDER BY rssize;
SHOW PARAMETER undo_tablespace;
SELECT tablespace_name FROM dba_tablespaces WHERE contents = 'UNDO';
SELECT TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME,
TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME,
UNDOBLKS
FROM V$UNDOSTAT;
SELECT a.name, b.xacts, b.writes, b.extents
FROM v$rollname a, v$rollstat b
WHERE a.usn = b.usn;
COL username FORMAT A10
COL name FORMAT A10
SELECT a.username, b.name, c.used_ublk
FROM v$session a, v$rollname b, v$transaction c
WHERE a.saddr = c.ses_addr
AND b.usn = c.xidusn
AND a.username = 'HR';
| 列名 | 含義 |
|---|---|
| USN | 回滾段編號 |
| EXTENTS | 回滾段擁有的擴展數 |
| RSSIZE | 回滾段大小(位元組) |
| WRITES | 寫入回滾段的位元組數 |
| XACTS | 活動事務數 |
| GETS/WAITS | Header 獲取/等待次數 |
| OPTSIZE | 最優尺寸 |
| HWMSIZE | 高水位標記 |
| SHRINKS/WRAPS/EXTENDS | 縮減/環繞/擴展次數 |
| STATUS | 狀態:ONLINE/OFFLINE/PENDING OFFLINE/FULL |

ORA-01555 "Snapshot too old" 根因:長查詢需要的舊 Undo 已被覆寫。解決方案:
UNDO_RETENTION 參數值大於最長查詢執行時間IMU 與 Private Redo Strand 是 Oracle 10g 為高併發 OLTP 優化的核心技術,通過「私有緩衝、批量提交」思想,顯著降低了 Latch 爭用與 Redo 生成量。DBA 應熟悉相關動態視圖監控指標,結合 Undo 表空間規劃,有效預防 ORA-01555 等讀一致性問題。