首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 性能調優實戰方法論:索引、預編譯、WHERE 順序、SELECT *、批次執行、HAVING 改 WHERE 七大核心技巧

     編輯:關於SqlServer

調優方法論:自上而下、量化驅動

  1. 識別慢 SQL (Profiler/XEvents/Query Store)
  2. 分析執行計劃 (估算 vs 實際、缺失索引提示、運算子成本)
  3. 針對性應用技巧 → 驗證效果 → 固化最佳實踐

七大核心技巧深度解析

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):索引/分區建議
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved