SQL Server 效能調優的關鍵在於邏輯資料庫設計與索引策略的合理規劃。本文系統整理九大 SQL 語句優化原則,涵蓋索引設計、空值處理、子查詢優化、格式轉換避免等核心技巧,助您從根源提升查詢效能。
索引是加速資料遍歷的利器,但「索引越多越好」是危險誤區。預設建立的非叢集索引將資料隨機分散於資料頁,需依據查詢模式精準佈局:
含 NULL 值的欄位不會被納入索引,複合索引中任一欄位有 NULL 即被排除。WHERE 子句使用 IS NULL 或 IS NOT NULL 時,優化器直接放棄索引掃描,轉為全表掃描。建議:業務允許時設定 NOT NULL 約束並給予預設值。
EXISTS 採用 Range Scan,IN 易退化為 Full Table Scan。幾乎所有 IN 子查詢均可改寫為 EXISTS 形式,效能提升顯著。範例:
-- 低效
SELECT * FROM Orders WHERE CustomerID IN (SELECT CustomerID FROM Customers WHERE City='London');
-- 高效
SELECT * FROM Orders o WHERE EXISTS (SELECT 1 FROM Customers c WHERE c.CustomerID=o.CustomerID AND c.City='London');
大量資料集下,CAST/CONVERT 等格式轉換會嚴重消耗 CPU,應在應用層完成資料清洗,或確保比較雙方資料型別一致。
僅有一個 OUTPUT 參數的預存程序,呼叫時必須給予初始值,否則拋出錯誤。此問題在 SQL Server 2005 及後續版本已修正。
任何索引皆可輔助排序與分組,但索引欄含 NULL 值時優化器無法利用索引,需注意欄位約束設計。
WHERE 子句對欄位施加函數、運算式(如 WHERE YEAR(OrderDate)=2023)會導致索引失效,應改寫為 WHERE OrderDate >= '2023-01-01' AND OrderDate < '2024-01-01',使優化器能利用索引範圍掃描。
IN、OR 易產生工作表導致索引失效。若不產生大量重複值,可拆分為多條 UNION ALL 查詢,各子句保留索引欄位。
SET SHOWPLAN_ALL ON:查看詳細執行計畫,定位昂貴操作。DBCC CHECKDB:定期驗證資料庫邏輯/物理完整性,預防資料損壞。效能優化是系統工程:從邏輯模型規範、索引精準佈局、查詢改寫習慣、工具輔助分析四個維度持續迭代,方能讓 SQL Server 在高併發、大數據量下穩定高效運行。