索引核心概念
資料庫索引如同書本目錄,對資料表一或多個欄位值進行排序,提供快速定位特定列的能力。
優點
- 大幅加速查詢速度(主要引入原因)
- 唯一性索引保證資料唯一
- 加速資料表聯結(參考完整性)
- 優化 GROUP BY、ORDER BY 操作
缺點
- 佔用實體空間(叢集索引佔用更大)
- 建立與維護耗費時間,隨資料量增長而增加
- INSERT/UPDATE/DELETE 需同步維護索引,增加系統負擔
索引分類
依儲存結構
| 類型 | 特性 | 限制 |
| 叢集索引 | 資料實體儲存順序與索引順序完全一致;兩層架構:索引頁 + 資料頁 | 每個資料表僅能建立 一個 |
| 非叢集索引 | 邏輯順序與實體儲存順序分離;葉層包含資料列指標 | 每個資料表最多 249 個 (SQL 2005) / 999 個 (SQL 2008+) |
依鍵值特性
- 唯一索引:鍵值唯一,可建立於非主鍵欄位
- 複合索引:多欄位組合建立,欄位順序影響查詢效能
建立索引原則
- 僅資料表擁有者可建立
- 經常查詢的欄位(WHERE、JOIN、ORDER BY)優先建立
text、image、bit 資料類型無法建立索引
- 外鍵欄位建議建立索引;主鍵自動建立叢集索引
- 重複值極高、查詢極少的欄位勿建立索引
三種建立方式
- SSMS 圖形介面:資料表 → 索引 → 右鍵「新增索引」
- T-SQL CREATE INDEX
- CREATE/ALTER TABLE 定義約束:主鍵/唯一約束自動建立對應索引
T-SQL CREATE INDEX 語法
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX 索引名稱
ON <物件> (欄位 [ASC | DESC] [,...n])
[ INCLUDE (欄位名稱 [,...n]) ]
[ WITH (<索引選項> [,...n]) ]
[ ON 檔案群組名稱 ]
範例:
USE db_student;
CREATE CLUSTERED INDEX zindex ON course(課程代號);
索引查看、修改、刪除
| 操作 | SSMS | T-SQL |
| 查看 | 資料表 → 索引 → 屬性 | EXEC sp_helpindex '資料表名稱' |
| 修改 | 索引屬性 → 重建/重組 | ALTER INDEX ALL ON course REBUILD WITH (FILLFACTOR=80) |
| 刪除 | 右鍵索引 → 刪除 | DROP INDEX course.zindex |
索引分析與維護
分析工具
SET SHOWPLAN_ALL ON / SET SHOWPLAN_XML ON:顯示執行計畫(不執行)
SET STATISTICS IO ON:顯示邏輯/實體讀取統計
維護指令
| 指令 | 用途 | 語法範例 |
DBCC SHOWCONTIG | 顯示資料與索引碎片資訊 | DBCC SHOWCONTIG('course', 'zindex') WITH FAST |
DBCC DBREINDEX | 重建一或多個索引(離線) | DBCC DBREINDEX('dbo.course', 'zindex', 80) |
DBCC INDEXDEFRAG | 線上整理碎片(SQL 2005/2008) | DBCC INDEXDEFRAG(db_id, object_id, index_id) |
ALTER INDEX ... REBUILD | 重建索引(支援 ONLINE=ON,Enterprise 版) | ALTER INDEX ALL ON course REBUILD WITH (ONLINE=ON) |
ALTER INDEX ... REORGANIZE | 重組索引葉層(線上、輕量) | ALTER INDEX ALL ON course REORGANIZE |
維護策略建議
- 碎片率 5-30%:
REORGANIZE(線上、低影響)
- 碎片率 > 30%:
REBUILD(完全重建,可選 ONLINE)
- 定期排程維護計畫執行,搭配
FILLFACTOR 預留空間減少分頁分裂
- 監控
sys.dm_db_index_physical_stats 動態管理檢視追蹤碎片狀態
掌握索引架構、建立原則、分析工具與維護策略,才能讓索引真正為查詢效能服務,而非成為系統負擔。