CREATE TABLE student (
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
sUserName NCHAR(10),
sAddress VARCHAR(200),
classID INT,
create_date DATETIME DEFAULT GETDATE()
);
-- 無任何非聚集索引
需求:SELECT sUserName, sAddress FROM student WHERE classID = 9
IX_classID → Index Seek + Key LookupCREATE INDEX IX_classID ON student(classID);
classID=9 的鍵值範圍。ID 回表取 sUserName, sAddress。IX_classID_Cover → 純 Index SeekCREATE INDEX IX_classID_Cover ON student(classID) INCLUDE (sUserName, sAddress);
| 方案 | 邏輯讀 | 物理讀 | CPU | 適用場景 |
|---|---|---|---|---|
| 全掃描 | 極高 | 高 | 高 | 返回大比例數據、臨時表 |
| 索引+回表 | 中 | 低 | 低 | 高選擇性、少列投影 |
| 覆蓋索引 | 極低 | 極低 | 極低 | 高頻固定查詢模式 |
sys.dm_db_index_usage_stats: 定期清理未用/重疊索引。索引不是銀彈,但「無索引必全掃」是鐵律。從執行計劃看懂 Scan→Seek→Cover 的演進,是每個 SQL 開發者的必修課。