首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Clustering Factor 叢集因子深度解析:索引掃描成本關鍵

     編輯:Oracle 資料庫基礎

實驗設計

  1. 基表 SOURCE:100 萬行,X 有序 1..1M,Y 隨機數。
  2. 派生兩表:
    • TAB01:SELECT * FROM SOURCE(保持 X 有序)。
    • TAB02:SELECT * FROM SOURCE ORDER BY Y(X 亂序)。
  3. 兩表均於 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(劇增!)

根因:Clustering Factor 差異

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   -- 接近行數,極差
  • CF 接近塊數:表數據按索引鍵順序存儲,區間掃描少量 Consistent Gets。
  • CF 接近行數:表數據順序與索引鍵無關,每行可能在不同塊,區間掃描產生大量隨機 I/O。

SQL Server 對比實驗

同樣構造有序/亂序表,SQL Server 邏輯讀均為 1,007,**無顯著差異**。說明 CF 機制為 Oracle 特有,SQL Server 存儲引擎處理方式不同。

啟示

「所有數據庫本質上都不同。為新平台設計應用時,不能對數據庫如何工作做任何假設。學習新數據庫應假設自己從未用過數據庫。在一個數據庫能做的事,在另一個可能沒必要做,甚至根本做不到。」—— Thomas Kyte

理解 Clustering Factor 有助於:評估索引效用、決定是否重組表(ALTER TABLE ... MOVE)、解釋同樣數據不同機器性能差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved