叢集是根據叢集鍵值將相關資料表的資料行實際儲存在同一磁碟區域,以達到快速檢索的目的。叢集索引的順序即資料的物理儲存順序,葉節點即資料節點。一個資料表最多只能建立一個叢集索引。
將經常一起連接查詢的資料表(如 BOOKSHELF 與 BOOKSHELF_AUTHOR)依共同鍵值(如 Title)集中儲存,減少 I/O。每個唯一鍵值在叢集中僅儲存一次,兩表欄位附加於後,彷彿一張大表。
-- 1. 建立叢集
CREATE CLUSTER BOOKandAUTHOR (Col1 VARCHAR2(100));
-- 2. 建立叢集索引(插入資料前必須建立)
CREATE INDEX BOOKandAUTHORndx ON CLUSTER BOOKandAUTHOR;
-- 3. 建立屬於叢集的資料表
CREATE TABLE BOOKSHELF (
Title VARCHAR2(100) PRIMARY KEY,
Publisher VARCHAR2(20),
CategoryName VARCHAR2(20),
Rating VARCHAR2(2),
CONSTRAINT CATFK FOREIGN KEY (CategoryName) REFERENCES CATEGORY(CategoryName)
) CLUSTER BOOKandAUTHOR(Title);
CREATE TABLE BOOKSHELF_AUTHOR (
Title VARCHAR2(100),
AuthorName VARCHAR2(50),
CONSTRAINT TitleFK FOREIGN KEY (Title) REFERENCES BOOKSHELF(Title),
CONSTRAINT AuthorNameFK FOREIGN KEY (AuthorName) REFERENCES AUTHOR(AuthorName)
) CLUSTER BOOKandAUTHOR(Title);
叢集鍵與資料表欄位依「位置順序」對應,而非名稱。
單一資料表、固定透過主鍵等值查詢(SELECT * FROM T WHERE id = :x)。Oracle 以雜湊演算法直接計算資料物理位置,無需索引掃描,單次存取即取得資料。
-- 基本雜湊叢集
CREATE CLUSTER personnel (department_number NUMBER)
SIZE 512 HASHKEYS 500
STORAGE (INITIAL 100K NEXT 50K);
-- 複合鍵雜湊叢集(自訂雜湊函數)
CREATE CLUSTER personnel (home_area_code NUMBER, home_prefix NUMBER)
HASHKEYS 20
HASH IS MOD(home_area_code + home_prefix, 101);
-- 單表雜湊叢集(9i+ 支援)
CREATE CLUSTER personnel (deptno NUMBER)
SIZE 512 SINGLE TABLE HASHKEYS 500;
SIZE)與預估鍵值數(HASHKEYS)。索引叢集適合多表連接查詢;雜湊叢集適合單表主鍵等值查詢。正確選擇叢集類型並妥善設定參數,能顯著提升特定查詢模式的效能。