高併發 OLTP 下,Redo Allocation Latch 爭用 成為熱點。
_log_parallelism -- 初始 Strand 數 (10g 隱含) _log_parallelism_max -- 最大 Strand 數 _log_parallelism_dynamic -- 是否動態調整 (TRUE/FALSE)
SELECT indx, strand_size_kcrfa FROM x$kcrfstrand WHERE last_buf_kcrfa != '00'; -- 範例輸出:2 個 Shared Strand,各 3.35 MB -- LOG_BUFFER = 7,028,736 → 7MB/2 ≈ 3.5MB
_log_parallelism_max 不得超過 CPU_COUNT。_log_parallelism,完全由 _log_parallelism_max、_log_parallelism_dynamic、CPU_COUNT 決定。V$SGASTAT 名稱 private strands)。SELECT * FROM v$sgastat WHERE name LIKE '%strand%'; -- POOL: shared pool NAME: private strands BYTES: 2,684,928 SELECT indx, strand_size_kcrfa FROM x$kcrfstrand WHERE last_buf_kcrfa = '00'; -- Private Strand 標記 -- 大量小 Strand (如 66KB x 多個)
SELECT DECODE(BITAND(ktcxbflg, 4096), 0, 1, 0) AS used_private_strand, COUNT(*) FROM x$ktcxb WHERE BITAND(ksspaflg, 1) != 0 AND BITAND(ktcxbflg, 2) != 0 GROUP BY BITAND(ktcxbflg, 4096); -- USED_PRIVATE_STRAND COUNT(*) -- 1 (使用) 10 -- 0 (未使用) 1
注意:交易一旦進入 Shared Strand 流程,即使後來有 Private Strand 釋出,也不會切換回 Private Strand。
| 階段 | 機制 | Latch 爭用點 | 適用場景 |
|---|---|---|---|
| 單 Strand | 單一 Log Buffer | Redo Allocation Latch (單點熱點) | 低併發 |
| Shared Strand | Log Buffer 多分區 | 多個 Allocation Latch 分散 | 中高併發、10g 前 |
| Private Strand | Shared Pool 獨立記憶體,交易專用 | 幾乎消除 Allocation/Copy Latch 爭用 | 高併發 OLTP、10g+ 預設啟用 |