資料庫系統是資訊系統核心,查詢操作佔絕大多數負載。當資料量達百萬至千萬筆,全表掃描可能耗時數小時,而良好的查詢策略可將時間壓縮至分鐘級。本文結合理論與實戰,系統說明查詢優化關鍵技術。
關鍵認知:優化器依賴使用者撰寫的 SQL 作為基礎。糟糕的 SQL 經優化器仍難產生高效計畫。開發人員必須掌握優化原則。
ORDER BY、GROUP BY 欄位建索引可避免 Sort 運算子。WHERE 條件中區分度高的欄位(如身分證號、訂單號)建索引;低選擇性(性別、狀態碼)勿建索引,反而拖慢寫入。DBCC SHOWCONTIG/sys.dm_db_index_physical_stats 檢查碎片,大量更新後重建索引。ORDER BY 欄位順序與索引鍵順序一致時,最佳化器可省略 Sort。ORDER BY t1.col, t2.col 無法利用單一索引。WHERE 過濾再 ORDER BY,或使用 TOP N 限制輸出行數。外層行數 × 內層行數 的災難性 I/O。Student.StudentID、Enrollment.StudentID)。UNION ALL 拆解離散條件:WHERE (A=1 AND B>10) OR A=5 → WHERE A=1 AND B>10 UNION ALL WHERE A=5,各分支可獨立利用索引。JOIN、EXISTS、CROSS APPLY、窗口函數、暫存表 預先聚合。LIKE '%keyword%'、LIKE '_pattern'(非開頭萬用字元)無法利用索引,強制掃描。LIKE 'prefix%' 可利用索引求存。SUBSTRING(col,2,3) = 'abc' → 改用計算欄位+索引或全文搜尋。#TempTable 或 @TableVar,建立索引後後續查詢可重複利用。ORDER BY 叢集索引鍵後再處理,或建立覆蓋索引(INCLUDE 欄位)消除 Key Lookup。INSERT ... ORDER BY ClusterKey 可產生循序寫入,減少頁分割。ALTER DATABASE SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN = ON)。sys.dm_exec_query_stats、sys.dm_exec_requests、sys.dm_os_wait_stats 即時診斷。WHERE/JOIN/ORDER BY 欄位有適當索引(含覆蓋索引)。Table Scan、Key Lookup、Sort、Spool、Parallelism 異常。DBCC SHOW_STATISTICS 驗證基數估計。READ_COMMITTED_SNAPSHOT、SNAPSHOT 隔離等級。