Oracle B-Tree 索引結構受區塊大小直接影響:更大區塊容納更多索引鍵值,降低樹高、減少一致性讀取。本文解析索引內部結構、區塊大小對樹高的影響、實測 8K→16K 區塊將 Consistent Gets 減半的完整過程,並探討索引重建爭議與 10g 自動維護任務(AMT)。
(索引鍵值, 子區塊指標),導航至下一層。(索引鍵值, ROWID),指向表實際資料列。公式:每區塊可容納索引項目數 ≈ (區塊大小 - 區塊頭) / (鍵值長度 + ROWID 長度 + 開銷)
項目數倍增 → 樹高降低 1-2 層 → 索引範圍掃描所需 Consistent Gets 大幅下降。
INDX_16K、16K 快取。ERADMIN.ADMISSION,索引 ADMISSION_PATIENT_ID(非唯一)。SELECT COUNT(*) FROM eradmin.admission WHERE patient_id BETWEEN 1 AND 40000;Statistics
----------------------------------------------------------
421 consistent gets
0 physical reads
ALTER INDEX eradmin.admission_patient_id REBUILD NOLOGGING NOREVERSE TABLESPACE indx_16k;
Statistics
----------------------------------------------------------
211 consistent gets -- 減半!
0 physical reads
邏輯讀減半直接轉化為 CPU、閂鎖爭用降低,高併發下效能增益顯著。
| 區塊大小 | 建議用途 | 快取設定 |
|---|---|---|
| 2K/4K | OLTP 核心表、高併發小交易 | DEFAULT KEEP/RECYCLE |
| 8K(預設) | 通用表、索引 | DEFAULT | 16K/32K | 大型索引、資料倉儲事實表、全表掃描對象 | 專用 DB_16K_CACHE_SIZE, DB_32K_CACHE_SIZE |
啟用方式:ALTER SYSTEM SET DB_16K_CACHE_SIZE=200M SCOPE=BOTH; 需重啟實例生效(9i/10g),11g+ 可動態調整。
-- 檢查索引高度
SELECT index_name, blevel, leaf_blocks, distinct_keys, clustering_factor
FROM user_indexes
WHERE table_name = 'ADMISSION';
-- BLEVEL >= 3 且 CLUSTERING_FACTOR 接近 NUM_ROWS 時,考慮重建/分區
-- 結合 AWR 報告 "Segments by Logical Reads" 找出高邏輯讀索引
BLEVEL、CLUSTERING_FACTOR 判斷,或交由 10g+ AMT 自動處理。掌握區塊大小與索引結構的物理關係,能從存儲層面根治索引存取瓶頸,是資深 DBA 進階調校的關鍵技能。