優化本質:在結果正確前提下,撰寫優化器可識別的語句,充分利用索引,減少表掃描 I/O,避免鍵查詢與排序溢寫。
SELECT *、隱含轉換、非 SARGable 條件 (函數包裹欄位)、OR 破壞索引查找。BACKUP LOG ... WITH TRUNCATE_ONLY (舊版) / 完整模式定期記錄備份。WHERE Col IS NULL 觸發掃描。改用 WHERE Col = -1 (哨兵值) 或過濾索引 WHERE Col IS NOT NULL。EXISTS 為相關子查詢,可短路;IN 產生列表掃描。幾乎所有 IN 子查詢可改寫為 EXISTS。CONVERT, CAST, FORMAT 在 WHERE/JOIN 破壞索引。轉換移至 SELECT 清單或應用層。WHERE DateCol + 1 > @Date → WHERE DateCol > DATEADD(DAY, -1, @Date)。任何欄位運算導致掃描。UNION ALL + 索引提示。SET SHOWPLAN_ALL ON / SSMS 圖形化計畫 / sys.dm_exec_query_plan。識別 Scan、Key Lookup、Sort、Parallelism 不平衡。DBCC CHECKDB,離峰執行,PHYSICAL_ONLY 加速。SE_MANAGE_VOLUME_NAME,加速資料檔案擴展。| 工具 | 用途 |
|---|---|
| Query Store (SQL 2016+) | 計畫演變、回歸偵測、強制計畫 |
| Extended Events | 輕量級事件蒐集 (等待、死鎖、長時間查詢) |
| DMV (dm_exec_query_stats, dm_os_wait_stats, dm_db_index_usage_stats) | 即時效能指標 |
| sp_WhoIsActive | 即時活動會話、阻塞鏈、Tempdb 耗用 |
| PerfMon / Sysmon | OS 層面 CPU、磁碟、記憶體、網路 |
SQL 效能優化是邏輯設計 → 索引設計 → 查詢重寫 → 系統配置 → 持續監控的系統工程。最大收益來自正確的邏輯/索引/查詢設計;系統參數調校為錦上添花。建立基線、設定告警、定期複盤 Top N 慢查詢,養成「優化即治理」文化。