調優方法論:自上而下、量化驅動
- 識別慢 SQL (Profiler/XEvents/Query Store)
- 分析執行計劃 (估算 vs 實際、缺失索引提示、運算子成本)
- 針對性應用技巧 → 驗證效果 → 固化最佳實踐
七大核心技巧深度解析
1. 創建必要索引 (聚集 vs 非聚集)
- 聚集索引:物理順序 = 索引順序,每表 1 個。適合:範圍查詢、排序、分組、主鍵
- 非聚集索引:邏輯順序,葉級含行定位器 (RID/聚集鍵)。適合:點查、JOIN、WHERE 過濾
- 覆蓋索引:`INCLUDE` 非鍵列消除鍵查找
- 維護:定期 `REBUILD` (碎片 >30%) / `REORGANIZE` (5-30%)、更新統計
2. 使用參數化查詢 / 預編譯 (存儲過程、sp_executesql)
- 首次執行:解析→編譯→優化→緩存計劃
- 後續執行:直接復用計劃,省去編譯開銷
- 防 SQL 注入、計劃緩存復用率高
3. 調整 WHERE 子句條件順序 (舊版本優化器相關)
早期優化器自下而上解析 WHERE,現代優化器 (SQL 2005+) 基於成本自動重排,**無需手動調整順序**。重點應放在:
- 寫 SARGable 條件 (列不參與函數/運算)
- 高選擇性條件優先 (優化器會自動評估)
- 避免 `OR` 導致掃描,改 `UNION ALL`
4. 避免 SELECT *
- 網絡傳輸量減少
- 覆蓋索引命中率提升
- 減少內存/TempDB 壓力 (排序/哈希)
- Schema 變更不影響應用
5. 多條 SQL 合併批次執行
- 減少網絡往返 (RTT)
- 單次編譯優化多語句
- Table-Valued Parameters (TVP) 批量傳參
6. 用 WHERE 替換 HAVING (非聚合過濾)
- `WHERE` 在聚合前過濾行,減少聚合輸入
- `HAVING` 在聚合後過濾組,僅用於聚合條件 (如 `HAVING COUNT(*) > 10`)
7. 顯式列出列名而非 *
同第 4 點,強調代碼規範。
進階調優清單
| 領域 | 關鍵動作 |
| 統計信息 | `AUTO_CREATE_STATISTICS ON`、`AUTO_UPDATE_STATISTICS ON`、大表手動 `FULLSCAN` |
| 參數嗅探 | `OPTION (RECOMPILE)` / `OPTIMIZE FOR UNKNOWN` / 計劃指南 |
| 查詢重寫 | 子查詢→JOIN、IN→EXISTS、OR→UNION ALL、游標→集合操作 |
| 分區表 | 大表按時間分區、分區消除、滑動窗口歸檔 |
| 硬件 | TempDB 多文件、Instant File Initialization、MAXDOP、內存上限 |
工具鏈
- SSMS:執行計劃、缺失索引、Client Statistics
- Query Store (SQL 2016+):計劃歷史、回歸檢測、強制計劃
- Extended Events:輕量級持久化跟蹤
- DTA (Database Engine Tuning Advisor):索引/分區建議