當兩張表(如 EMP、DEPT)頻繁 JOIN 且按同一鍵值(DEPTNO)訪問時,將其物理存儲在同一數據塊中可大幅減少 I/O。索引聚簇表正是解決此類場景的利器。本文深度解析其工作原理,並演示從創建聚簇、聚簇索引到建表載數據的完整流程。
CONN scott/tiger;
CREATE CLUSTER emp_dept_cluster (deptno NUMBER(2))
SIZE 1024;
SIZE 參數:預估每個聚簇鍵值關聯的數據量(位元組)。假設塊大小 8KB,SIZE=1024 → 每塊最多 7 個鍵值(10,20,30,40,50,60,70)。第 8 個鍵值(80)將插入新塊。SIZE 過大浪費空間,過小導致鏈接行增加,需根據業務調優。
CREATE INDEX emp_dept_cluster_idx ON CLUSTER emp_dept_cluster;
聚簇索引映射:鍵值 → 塊地址。查詢時先走聚簇索引定位塊,再讀取塊內所有行。
CONN segment_study/liugao;
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);
SELECT cluster_name, table_name
FROM user_tables
WHERE cluster_name IS NOT NULL
ORDER BY 1;
CLUSTER_NAME TABLE_NAME
---------------- ----------
EMP_DEPT_CLUSTER DEPT
EMP_DEPT_CLUSTER EMP
| 參數 | 影響 | 調優方向 |
|---|---|---|
| SIZE | 每塊鍵值數、空間利用率、鏈接行 | 預估單鍵值數據量,留 10-20% 預留;監控 CHAIN_CNT 調整 |
| 聚簇索引 | 鍵值定位速度 | 定期 REBUILD 防止碎片 |
| PCTFREE | 塊預留空間 | 高更新表適當調大,減少行遷移 |
索引聚簇表通過「物理共存」消除 JOIN I/O,是特定訪問模式下的利器。掌握 CREATE CLUSTER → CREATE INDEX ON CLUSTER → CREATE TABLE ... CLUSTER 三步曲,並精準設置 SIZE,即可發揮最大效能。