平衡 B*Tree 所有葉塊位於同一層級。BLEVEL (Branch Level) 表示分支層數 (不含葉層),HEIGHT = BLEVEL + 1。百萬級資料通常 2-3 層。
SQL> SELECT index_name, blevel, num_rows FROM dba_indexes WHERE table_name='TM_VEHICLE';
INDEX_NAME BLEVEL NUM_ROWS
TM_VEHICLE_LEAVING_DATE 2 3461864
SQL> ANALYZE INDEX TM_VEHICLE_LEAVING_DATE VALIDATE STRUCTURE;
SQL> SELECT height, name FROM index_stats;
HEIGHT NAME
3 TM_VEHICLE_LEAVING_DATE
CREATE INDEX ... COMPRESS n (n 為前綴欄位數)。CREATE INDEX ... REVERSE 將鍵值位元組順序反轉存儲。BETWEEN, >, <)。CREATE INDEX ... DESC 讓指定欄位以降序存儲,配合 ORDER BY col DESC 避免排序操作。
SELECT index_name, clustering_factor, blocks, num_rows FROM user_indexes i JOIN user_tables t ON i.table_name=t.table_name;-- 有序表 COLOCATED (PK=x 遞增)
CF = 1,190 (≈ blocks 1,252)
SELECT * FROM colocated WHERE x BETWEEN 10000 AND 20000;
-- Plan: INDEX RANGE SCAN -> TABLE ACCESS BY ROWID Cost=142
-- 無序表 DISORGANIZED (依 y 排序建表,PK=x 相同)
CF = 99,905 (≈ num_rows 100,094)
SELECT * FROM disorganized WHERE x BETWEEN 10000 AND 20000;
-- Plan: FULL TABLE SCAN Cost=271
相同索引結構,CF 差異導致執行計劃從索引掃描退化為全表掃描,成本差近 2 倍。
AND/OR/NOT 位元運算快速合併。ANALYZE INDEX ... VALIDATE STRUCTURE 監控 HEIGHT、LF_BLKS、DEL_LF_ROWS。ALTER INDEX ... REBUILD 或 COALESCE 整理碎片 (DEL_LF_ROWS > 20%)。V$SEGMENT_STATISTICS 中 logical reads、physical reads 判斷索引效益。DROP 或 UNUSABLE 節省 DML 開銷。索引不是銀彈。理解 B*Tree 結構、CF 意義、壓縮/反轉/遞減/位圖各類型適用場景,配合持續監控與精準維護,才能在 OLTP 與 DW 雙重負載下榨乾儲存與 I/O 效能。