在確保功能正確的前提下,SQL 查詢優化的核心在於:減少資料庫存取次數、縮小掃描範圍、最小化結果集、降低網路負載。以下原則能幫助你撰寫高效能的查詢語句:
避免使用 SELECT * FROM T1 這類通配符查詢。只選取業務真正需要的欄位,例如 SELECT COL1, COL2 FROM T1,能顯著減少 I/O 與網路傳輸。
當使用者不需要海量資料時,加上 LIMIT 子句(如 SELECT TOP 300 COL1, COL2, COL3 FROM T1)可避免全表掃描與大量資料傳輸。
SARG(Search Argument)是優化器能利用索引的條件形式:
欄位 操作符 常數/變數 或 常數/變數 操作符 欄位
例如:Name = '張三'、價格 > 5000、Name = '張三' AND 價格 > 5000
不符合 SARG 的條件(如函數運算、隱含轉換)會導致全表掃描。
WHERE num IS NULL 會放棄索引。預設值設為 0,改用 WHERE num = 0。WHERE num = 10 OR num = 20 應改用 UNION ALL 分開查詢再合併。BETWEEN(WHERE num BETWEEN 1 AND 3)。LIKE '%L%' 或 SUBSTRING(NAME,2,1)='L' 無法用索引;LIKE 'L%' 才能命中索引。WHERE num = @num)編譯時值未知,易導致全表掃描。可用 WITH (INDEX(索引名)) 強制走索引。WHERE F1/2 = 100 → WHERE F1 = 100*2;WHERE SUBSTRING(CARD_NO,1,4)='5378' → WHERE CARD_NO LIKE '5378%'。WHERE DATEDIFF(yy, datofbirth, GETDATE()) > 21 → WHERE dateofbirth < DATEADD(yy, -21, GETDATE())。原則:把運算移到等號右邊。SELECT num FROM a WHERE EXISTS (SELECT 1 FROM b WHERE num = a.num)IN 子查詢,避免大量鎖定與掃描。IF EXISTS (SELECT * FROM table WHERE col = 'xxx') 遠快於 COUNT(*)。CREATE TABLE 再 INSERT。TRUNCATE TABLE 再 DROP TABLE,避免長時間鎖定系統表。salary (money) > 60000 (int) 會阻礙優化。編碼階段就做好型別轉換。WHERE A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO = B.ACCOUNT_NO 比單一條件快得多。理論再好,不如實測。在查詢分析器中按 Ctrl+L 查看執行計劃,重點比較:索引使用情況、表掃描次數、查詢成本百分比。資料量小時差異不明顯,執行計劃分析是關鍵。