在基於成本的優化器(CBO)模式下,db_file_multiblock_read_count 是控制全表掃描單次 I/O 讀取塊數的關鍵參數。參數值越大,優化器估算的全掃描成本越低,進而影響執行計劃選擇。本文通過一張 70 萬行的 ORDER_DETAIL$ 表,實測不同參數值對 Cost 的變化趨勢,並解釋為何成本不再下降的拐點原理。
ORDER_DETAIL$,708,437 行,約 42 MBdb_file_multiblock_read_count = 16SET AUTOTRACE TRACEONLY EXPLAIN 獲取執行計劃| 參數值 | Cost (CPU%) | 預估時間 |
|---|---|---|
| 16 (默認) | 1,540 (5%) | 00:00:19 |
| 32 | 1,364 (5%) | 00:00:17 |
| 64 | 1,276 (5%) | 00:00:16 |
| 128 | 1,233 (6%) | 00:00:15 |
| 256 | 1,233 (6%) | 00:00:15 |
CBO 計算全表掃描 Cost 公式簡化為:
Cost ≈ (表總塊數 / 有效多塊讀計數) × 單次 I/O 成本因子
參數增大 → 分母變大 → Cost 變小 → 優化器更傾向選擇全表掃描而非索引訪問。
實際單次 I/O 能讀取的最大塊數受三因素共同制約:
db_file_multiblock_read_count 參數設定值當參數超過 Extent 能容納的塊數(128)時,Oracle 無法再發起更大的單次 I/O,Cost 自然觸底不再變化。
DB_FILE_MULTIBLOCK_READ_COUNT 為 0 時由系統自動計算)。db_file_multiblock_read_count 是影響全表掃描成本的核心杠桿,但其效果存在物理上限。調優時應結合段 Extent 大小、OS I/O 能力、內存資源綜合評估,切勿單純追求參數值最大化。