CREATE INDEX IX_MyTable_MyColumn ON MyTable (MyColumn);
CREATE CLUSTERED INDEX IX_MyTable_MyColumn_Clust ON MyTable (MyColumn);
CREATE CLUSTERED INDEX IX_MyTable_MyColumn_Dup ON MyTable (MyColumn)
WITH ALLOW_DUP_ROW; -- SQL 2000 語法,新版預設允許
CREATE UNIQUE CLUSTERED INDEX IX_MyTable_MyColumn_UClust ON MyTable (MyColumn);
CREATE UNIQUE NONCLUSTERED INDEX IX_MyTable_MyColumn_UNon ON MyTable (MyColumn);
CREATE INDEX IX_Users_Name ON Users (FirstName, LastName);
-- 等同於
CREATE INDEX IX_Users_Name ON Users (FirstName ASC, LastName ASC);
DROP INDEX MyTable.IX_MyTable_MyColumn; -- 必須指定表名.索引名
注意:主索引欄位不得為 NULL,且強制唯一。
| 屬性 | 說明 | 建議值 |
|---|---|---|
| Fill Factor (填滿因子) | 葉層頁面填滿百分比,預留空間減少頁分裂 | 叢集索引 80-90;唯讀表 100;高頻插入 70 |
| PAD_INDEX | 將 Fill Factor 套用至中間層頁面 | ON (配合 Fill Factor) |
| IGNORE_DUP_KEY | 唯一索引插入重複鍵時,忽略該列而非中止整批次 | 特定業務需求才開啟 |
| STATISTICS_NORECOMPUTE | 停用自動統計更新 | OFF (預設開啟) |
| ALLOW_ROW_LOCKS / ALLOW_PAGE_LOCKS | 允許列/頁鎖定 | ON (預設) |
| SORT_IN_TEMPDB | 建立索引時排序在 tempdb 進行 | 大索引建立時 ON,減少使用者資料庫日誌 |
| ONLINE | 線上建立/重建 (Enterprise Edition) | ON (生產環境避免封鎖) |
-- 檢測碎片
SELECT OBJECT_NAME(ips.object_id) AS TableName,
i.name AS IndexName,
ips.index_type_desc,
ips.avg_fragmentation_in_percent,
ips.page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips
JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE ips.avg_fragmentation_in_percent > 30 AND ips.page_count > 1000;
-- 重建/重組範例
ALTER INDEX IX_Table_Col ON TableName REBUILD WITH (FILLFACTOR = 80, ONLINE = ON);
ALTER INDEX IX_Table_Col ON TableName REORGANIZE;