SOURCE:100 萬行,X 有序 1..1M,Y 隨機數。TAB01:SELECT * FROM SOURCE(保持 X 有序)。TAB02:SELECT * FROM SOURCE ORDER BY Y(X 亂序)。IDX01/IDX02,收集統計信息。SELECT AVG(Y/(X+1)) FROM TAB01 WHERE X BETWEEN 10000 AND 30000;
-- 執行計劃:INDEX RANGE SCAN + TABLE ACCESS BY INDEX ROWID
-- Consistent Gets: 116
SELECT AVG(Y/(X+1)) FROM TAB02 WHERE X BETWEEN 10000 AND 30000;
-- 執行計劃:TABLE ACCESS FULL(優化器判斷索引代價過高)
-- Consistent Gets: 2,417
-- 強制使用索引
SELECT /*+ INDEX(TAB02 IDX02) */ AVG(Y/(X+1)) FROM TAB02 WHERE X BETWEEN 10000 AND 30000;
-- Consistent Gets: 20,058(劇增!)
SELECT idx.index_name, tab.table_name, tab.num_rows, tab.blocks, idx.clustering_factor
FROM user_indexes idx JOIN user_tables tab ON idx.table_name = tab.table_name;
INDEX_NAME TABLE_NAME NUM_ROWS BLOCKS CLUSTERING_FACTOR
IDX01 TAB01 995,426 2,459 4,723 -- 接近塊數,極佳
IDX02 TAB02 1,003,471 2,459 999,596 -- 接近行數,極差
同樣構造有序/亂序表,SQL Server 邏輯讀均為 1,007,**無顯著差異**。說明 CF 機制為 Oracle 特有,SQL Server 存儲引擎處理方式不同。
「所有數據庫本質上都不同。為新平台設計應用時,不能對數據庫如何工作做任何假設。學習新數據庫應假設自己從未用過數據庫。在一個數據庫能做的事,在另一個可能沒必要做,甚至根本做不到。」—— Thomas Kyte
理解 Clustering Factor 有助於:評估索引效用、決定是否重組表(ALTER TABLE ... MOVE)、解釋同樣數據不同機器性能差異。