雖然語法不同,但索引核心類型在三大資料庫中高度一致:
| 索引類型 | 核心特性 | 適用場景 |
|---|---|---|
| 叢集索引 | 資料行依鍵值物理排序存儲,每表僅一個 | 範圍查詢、排序、主鍵查找 |
| 非叢集索引 | 獨立 B-Tree 結構,葉節點存 Row Locator (RID/Rowid) | 點查詢、覆蓋索引、非主鍵存取 |
| 唯一索引 | 強制鍵值不重複,可為叢集或非叢集 | 業務唯一性約束(Email、身分證號) |
-- 基本非叢集索引(預設)
CREATE INDEX ind_emp ON emp(empno);
-- 複合索引(多欄位)
CREATE INDEX ind_emp1 ON emp(empno, ename);
-- 唯一非叢集索引
CREATE UNIQUE INDEX ind_sal ON emp(sal);
-- 叢集索引(每表僅一)
CREATE CLUSTERED INDEX ind_emp ON emp(empno);
-- 唯一叢集索引
CREATE UNIQUE CLUSTERED INDEX ind_sal ON f_emp(sal);
-- 重建索引(消除碎片)
ALTER INDEX ind_sal ON emp REBUILD;
-- 刪除索引
DROP INDEX ind_emp ON emp;
-- 查看索引
EXEC sp_helpindex emp;
SQL Server 特有:同一欄位組合可建立多個索引(含重複定義),需自行管理避免浪費空間。
-- 非唯一索引
CREATE INDEX ind_empno ON emp(empno);
-- 唯一索引
CREATE UNIQUE INDEX ind_empno ON emp(empno);
-- 包含索引:鍵值外附加非鍵欄位,避免回表(類似 Oracle 索引組織表/覆蓋索引)
CREATE UNIQUE INDEX IDX_ENAME ON emp(empno) INCLUDE(ename);
-- 叢集索引(DB2 稱為 clustering index)
CREATE INDEX ind_emp ON emp(empno) CLUSTER;
-- 唯一叢集索引
CREATE UNIQUE INDEX ind_sal ON u_emp(sal) CLUSTER;
-- 查看索引
DESCRIBE INDEXES FOR TABLE emp;
-- 刪除索引
DROP INDEX ind_emp;
DB2 亮點:
INCLUDE子句實現「包含索引」,將非鍵欄位直接存入葉節點,查詢SELECT empno, ename FROM emp WHERE empno=?可直接從索引滿足,無需回表,效能提升顯著。
-- 標準 B-Tree 索引
CREATE INDEX ind1 ON emp(mgr);
-- 反向索引:鍵值位元反轉,緩解右側增長熱塊
CREATE INDEX ind2 ON emp(deptno) REVERSE;
-- 降序索引:支援 ORDER BY DESC 避免排序
CREATE INDEX ind3 ON emp(hiredate DESC);
-- 位圖索引:低基數欄位、數據倉庫星型查詢
CREATE BITMAP INDEX ind4 ON emp(sal);
-- 函數索引:索引表達式結果,支援 WHERE UPPER(job)='CLERK'
CREATE INDEX ind5 ON emp(UPPER(job));
Oracle 進階索引(本表未列但實務常用):
- 分區索引:
LOCAL/GLOBAL配合分區表- 索引組織表 (IOT):
CREATE TABLE ... ORGANIZATION INDEX,資料即索引- 部分索引 (12c+):
INDEX ... WHERE status='ACTIVE'僅索引熱門資料- 不可見索引:
INVISIBLE測試移除影響不實際刪除
| 功能 | SQL Server | DB2 | Oracle |
|---|---|---|---|
| 基本索引 | CREATE INDEX i ON t(c) | CREATE INDEX i ON t(c) | CREATE INDEX i ON t(c) |
| 唯一索引 | CREATE UNIQUE INDEX i ON t(c) | CREATE UNIQUE INDEX i ON t(c) | CREATE UNIQUE INDEX i ON t(c) |
| 複合索引 | CREATE INDEX i ON t(c1,c2) | CREATE INDEX i ON t(c1,c2) | CREATE INDEX i ON t(c1,c2) |
| 叢集索引 | CREATE CLUSTERED INDEX i ON t(c) | CREATE INDEX i ON t(c) CLUSTER | 無直接對應(用 IOT) |
| 包含/覆蓋索引 | CREATE INDEX i ON t(c) INCLUDE(d) | CREATE INDEX i ON t(c) INCLUDE(d) | 函數索引/物化視圖替代 |
| 降序索引 | CREATE INDEX i ON t(c DESC) | 不支援(掃描反向) | CREATE INDEX i ON t(c DESC) |
| 位圖索引 | 不支援 | 不支援 | CREATE BITMAP INDEX i ON t(c) |
| 反向索引 | 不支援 | 不支援 | CREATE INDEX i ON t(c) REVERSE |
| 函數索引 | 計算欄位 + 索引 | 生成欄位 + 索引 | CREATE INDEX i ON t(UPPER(c)) |
| 查看索引 | sp_helpindex | DESCRIBE INDEXES | USER_INDEXES / USER_IND_COLUMNS |
| 重建索引 | ALTER INDEX REBUILD | REORG INDEXES | ALTER INDEX REBUILD |
| 刪除索引 | DROP INDEX i ON t | DROP INDEX i | DROP INDEX i |
INCLUDE;Oracle 用函數索引、物化視圖或直接在複合索引加入欄位。UPPER(col);SQL Server 依 Collation;DB2 用 UPPER() 生成欄位。REBUILD/REORGANIZE;Oracle REBUILD/COALESCE;DB2 REORG。三大資料庫索引核心語法高度相似(CREATE [UNIQUE] INDEX name ON table(col...)),差異在於進階功能的關鍵字。跨平台開發時,建議建立專案級「索引設計規範文件」,統一定義:命名慣例、叢集策略、覆蓋索引模式、維護窗口與重建閾值,確保效能基線一致。