在 Oracle 資料庫中,「聚簇」是指將擁有共同欄位的一組資料表,儲存在相同的資料區塊中。這項技術的核心概念是將關聯性高的資料預先存放在一起,以減少 I/O 操作、提升查詢效能。聚簇不僅適用於多表關聯,單一資料表也可依特定欄位分組存儲。
以經典的 EMP(員工)與 DEPT(部門)表為例,傳統儲存方式下,兩者分屬不同 Segment 甚至不同 Tablespace,資料絕不會位於同一個 Block。但業務上頻繁執行 SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno 這類關聯查詢。若能將同一部門的員工資料與部門資訊集中存放在少數幾個 Block,查詢時讀取的 Block 數大幅減少,系統 I/O 開銷自然隨之降低。
索引聚簇建立在「索引叢集」之上,叢集鍵記錄的是指向 Oracle Block 的指標,而非傳統索引指向的單一資料列。當查詢 deptno = 10 的資料時,Oracle 先讀取叢集索引定位 Block 位址,再直接讀取該 Block 內的所有相關資料(含 EMP 與 DEPT),若空間不足會自動串聯額外 Block。
CONN scott/tiger
CREATE CLUSTER emp_dept_cluster (deptno NUMBER(2)) SIZE 1024;
關鍵參數 SIZE 1024 告知 Oracle:每個叢集鍵值約關聯 1024 位元組資料。假設 Block 大小 8KB,Oracle 會在每個 Block 放置最多 7 個叢集鍵。SIZE 設定直接影響空間利用率:過大導致每 Block 鍵值過少浪費空間;過小則引發資料鏈結,違背聚簇初衷。
CREATE INDEX emp_dept_cluster_idx ON CLUSTER emp_dept_cluster;
叢集索引的任務是根據叢集鍵值快速返回對應 Block 位址。必須在插入資料前建立,否則會報錯 ORA-02032。
CREATE TABLE dept (
deptno NUMBER(2) PRIMARY KEY,
dname VARCHAR2(14),
loc VARCHAR2(13)
) CLUSTER emp_dept_cluster(deptno);
CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER,
hiredate DATE,
sal NUMBER,
comm NUMBER,
deptno NUMBER(2) CONSTRAINT emp_fk REFERENCES dept(deptno)
) CLUSTER emp_dept_cluster(deptno);
透過 CLUSTER emp_dept_cluster(deptno) 子句,兩張表正式綁定至同一叢集,共享儲存空間。
SELECT cluster_name, table_name
FROM user_tables
WHERE cluster_name IS NOT NULL
ORDER BY 1;
查詢結果將顯示 EMP_DEPT_CLUSTER 下掛載 DEPT 與 EMP 兩張表,代表建立成功。
索引聚簇表透過「叢集鍵 + 叢集索引」機制,將高關聯性資料物理聚集,顯著降低關聯查詢的 I/O 成本。關鍵在於合理設定 SIZE 參數,並在建表前完成叢集索引建立。掌握此技術,能為高頻 JOIN 場景帶來實質效能提升。