普通表按插入順序物理存放,大表查詢慢。叢集表將相同鍵值行集中存放減少塊讀取,但鍵值過多會產生過多叢集塊。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 操作