首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 10g 雜湊叢集表:ORA_HASH 限制塊數量、NATURAL ORDER 免排序查詢

     編輯:Oracle 資料庫相關知識

背景

普通表按插入順序物理存放,大表查詢慢。叢集表將相同鍵值行集中存放減少塊讀取,但鍵值過多會產生過多叢集塊。10g 引入 **Hash Cluster + ORA_HASH + SORT/NATURAL ORDER** 解決。

建立雜湊叢集表範例:信用卡交易

-- 1. 建立 Cluster
CREATE CLUSTER credit_cluster (
  card_no   VARCHAR2(16),
  transdate DATE SORT          -- NATURAL ORDER 關鍵字
)
HASHKEYS 10000                 -- 預估雜湊桶數量
HASH IS ORA_HASH(card_no)      -- 內建雜湊函數
SIZE 256;                      -- 每塊預估大小

-- 2. 建立表於 Cluster
CREATE TABLE credit_orders (
  card_no   VARCHAR2(16),
  transdate DATE,
  amount    NUMBER
)
CLUSTER credit_cluster (card_no, transdate);

-- 3. 設定日期格式並插入測試資料
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDDHH24MISS';
INSERT INTO credit_orders VALUES ('4111111111111111', '20050131000123', 57.99);
INSERT INTO credit_orders VALUES ('4111111111111111', '20050130071216', 16.59);
INSERT INTO credit_orders VALUES ('4111111111111111', '20050131111111', 39.00);
INSERT INTO credit_orders VALUES ('4111111111111111', '20050130081001', 25.16);

關鍵技術點

特性說明
HASHKEYS預先分配雜湊桶數量,避免動態擴展碎片。設為預估唯一鍵值數的 1.2-1.5 倍。
HASH IS ORA_HASH(col)10g 內建函數,將鍵值均勻映射到 0..HASHKEYS-1,無需自寫雜湊邏輯。
SORT / NATURAL ORDER叢集鍵中標記 SORT 的欄位(此處 transdate),同一雜湊桶內按該欄位**物理有序存放**。查詢時**無需 ORDER BY** 即可獲得有序結果,省去排序開銷。
SIZE每個叢集塊預估位元組數,影響儲存效率。

查詢優勢

-- 查詢某卡號所有交易,自動按 transdate 遞增返回
SELECT * FROM credit_orders WHERE card_no = '4111111111111111';
-- 執行計畫:CLUSTER ACCESS (HASH) -> 無 SORT ORDER BY 操作

適用場景與限制

  • ✅ 適用:高基數鍵值(信用卡號、用戶 ID)、固定查詢模式(單鍵值範圍掃描)、需有序輸出。
  • ❌ 不適用:頻繁全表掃描、連接其他大表、鍵值極低基數(性別、狀態碼)、需頻繁 DDL 變更結構。
  • ⚠️ 限制:Cluster 表不支援分區、不支援並行 DML、TRUNCATE 需 TRUNCATE CLUSTER。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved