索引是提升查詢效能的關鍵。本文詳細說明透過 T-SQL 指令與 Enterprise Manager 圖形介面建立各類索引:叢集/非叢集、唯一/非唯一、單欄/複合、允許重複列的叢集索引,並解析各選項意義。
類比書本索引:無索引逐頁翻閱 (全表掃描) vs 有索引直接定位頁碼 (索引搜尋)。大表查詢從數小時縮減至分鐘。
sp_spaceused 'table_name' 查看索引佔用| 類型 | 葉層內容 | 資料物理順序 | 每表上限 | 查詢優勢 |
|---|---|---|---|---|
| 叢集索引 | 實際資料列 | 與索引順序一致 | 1 個 | 範圍查詢、排序、大量資料存取極快 |
| 非叢集索引 | 指向資料列的書籤 | 與索引順序無關 | 249 個 | 精確點查詢、覆蓋索引 |
CREATE INDEX mycolumn_index ON mytable (mycolumn);
命名建議:IX_表名_欄位名 或 IDX_表名_欄位名,包含欄位名利於維護識別。
DROP INDEX mytable.mycolumn_index;
必須包含表名,因索引名稱僅在表內唯一。
CREATE CLUSTERED INDEX mycolumn_clust_idx ON mytable (mycolumn);
表有重複列時會報錯。需允許重複:
CREATE CLUSTERED INDEX mycolumn_cidx ON mytable (mycolumn)
WITH ALLOW_DUP_ROW;
-- 唯一叢集索引 (最常用、效能最佳)
CREATE UNIQUE CLUSTERED INDEX mycol_cidx ON mytable (mycolumn);
-- 唯一非叢集索引
CREATE UNIQUE NONCLUSTERED INDEX mycol_ncidx ON mytable (mycolumn);
最佳實務:盡可能建立唯一叢集索引 (通常加在主鍵/識別欄位),大幅強化查詢。
CREATE INDEX name_idx ON username (firstname, lastname);
關鍵差異:複合索引 = 單一索引覆蓋多欄位 (適合同時查詢多欄位);多個單欄索引 = 分別索引 (適合分別查詢各欄位)。
限制:主索引欄位不允許 NULL、強制唯一。
| 屬性 | 叢集 | 非叢集 | 說明 |
|---|---|---|---|
| 複合索引 (多欄位) | 支援 | 支援 | 最多 16 欄位 |
| 唯一約束 | 支援 | 支援 | 欄位值不可重複 |
| 允許重複列 | WITH ALLOW_DUP_ROW | 預設允許 | 叢集索引預設不允許重複 |
| 每表數量上限 | 1 | 249 | 含主鍵索引 |
-- 查看執行計畫
SET SHOWPLAN_ALL ON;
GO
SELECT * FROM mytable WHERE mycolumn = 'value';
GO
SET SHOWPLAN_ALL OFF;
觀察是否出現 Index Seek 而非 Table Scan。