效能調校的正確心法
SQL 調校非單靠 DBA 事後補救,而應貫穿設計、開發、部署、維運全生命週期:
- 設計階段:架構師規劃資料流、分區策略、索引初步設計。
- 開發階段:開發人員撰寫可測試、可優化的 SQL,避免反模式。
- 部署前:真實資料量壓測,驗證執行計畫符合預期。
- 維運階段:持續監控、定期統計更新、計畫變更偵測。
執行計畫核心解讀指標
| 運算子/屬性 | 關注意義 | 優化方向 |
| Table Scan / Clustered Index Scan | 全表掃描,無索引或索引未被使用 | 建立合適索引、修正 SARGable 條件 |
| Index Seek | 索引搜尋,高效率存取路徑 | 確保求取欄位覆蓋於索引 (Covering Index) |
| Key Lookup (Bookmark Lookup) | 非叢集索引求取後,再回叢集索引取欄位 | 加入 INCLUDE 欄位消除 Lookup |
| Sort | 排序操作,可能溢出 tempdb | 索引順序符合 ORDER BY、加大記憶體授予 |
| Hash Match / Merge Join | 大資料集聯結方式 | 確保聯結欄位有索引、統計資料最新 |
| Parallelism (交叉圖示) | 平行查詢 | 評估 MAXDOP 設定、查詢成本門檻 |
| Estimated vs Actual Rows 差異大 | 統計資料過期或參數嗅探 | UPDATE STATISTICS、OPTION (RECOMPILE) |
系統化優化流程
- 識別慢查詢:
sys.dm_exec_query_stats、Query Store、Extended Events。
- 取得實際執行計畫:SSMS Ctrl+M、
SET STATISTICS XML ON。
- 分析高成本運算子:關注 Estimated Subtree Cost 最高節點。
- 檢查索引建議:綠色提示的 Missing Index,但需人工評估寫入負擔。
- 改寫 SQL 或調整索引:消除掃描、Lookup、Sort、參數嗅探。
- 驗證成效:比較邏輯讀數、CPU、Duration、執行計畫形狀。
- 固定計畫(謹慎):Plan Guide、Query Store Force Plan。
常見反模式與修正
WHERE Col + '' = 'val'、WHERE YEAR(DateCol) = 2024 → 導致 Index Scan,改為 WHERE DateCol >= '2024-01-01' AND DateCol < '2025-01-01'。
SELECT * 造成 Covering Index 失效、Key Lookup → 明確列出欄位。
- 隱含轉換(VARCHAR 比對 NVARCHAR) → 統一資料型別或顯式 CAST。
- 過度使用標量函數 → 改為內嵌表值函數或直接展開邏輯。
結語
執行計畫是 SQL 引擎的「思維導圖」。熟練解讀並配合系統化流程,才能從根本解決效能瓶頸,而非頭痛醫頭。
- 上一篇文章: SQL 常用指令大全:DDL、DML、DCL 與進階查詢技巧
- 下一篇文章: SQL Server 2000 重裝遇到掛起檔案問題?完整清理解決方案
Copyright ©
程式碼之家 All Rights Reserved