首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

SQL Server、Oracle、DB2 三大資料庫索引建立語法全對照表

     編輯:Oracle 資料庫基礎

索引類型速覽:三大廠商共通觀念

雖然語法不同,但索引核心類型在三大資料庫中高度一致:

索引類型核心特性適用場景
叢集索引資料行依鍵值物理排序存儲,每表僅一個範圍查詢、排序、主鍵查找
非叢集索引獨立 B-Tree 結構,葉節點存 Row Locator (RID/Rowid)點查詢、覆蓋索引、非主鍵存取
唯一索引強制鍵值不重複,可為叢集或非叢集業務唯一性約束(Email、身分證號)

SQL Server 索引語法大全

-- 基本非叢集索引(預設)
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 特有:同一欄位組合可建立多個索引(含重複定義),需自行管理避免浪費空間。

DB2 索引語法大全

-- 非唯一索引
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=? 可直接從索引滿足,無需回表,效能提升顯著。

Oracle 索引語法大全

-- 標準 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 ServerDB2Oracle
基本索引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_helpindexDESCRIBE INDEXESUSER_INDEXES / USER_IND_COLUMNS
重建索引ALTER INDEX REBUILDREORG INDEXESALTER INDEX REBUILD
刪除索引DROP INDEX i ON tDROP INDEX iDROP INDEX i

跨平台遷移的關鍵決策點

  1. 叢集索引選擇:SQL Server 傾向主鍵建叢集;Oracle 無叢集概念,主鍵建唯一 B-Tree;DB2 可選 CLUSTER。
  2. 覆蓋索引實現:SQL Server/DB2 用 INCLUDE;Oracle 用函數索引、物化視圖或直接在複合索引加入欄位。
  3. 大小寫敏感查詢:Oracle 需函數索引 UPPER(col);SQL Server 依 Collation;DB2 用 UPPER() 生成欄位。
  4. 碎片整理:SQL Server REBUILD/REORGANIZE;Oracle REBUILD/COALESCE;DB2 REORG。

總結

三大資料庫索引核心語法高度相似(CREATE [UNIQUE] INDEX name ON table(col...)),差異在於進階功能的關鍵字。跨平台開發時,建議建立專案級「索引設計規範文件」,統一定義:命名慣例、叢集策略、覆蓋索引模式、維護窗口與重建閾值,確保效能基線一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved