首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 命令優化 9 大核心原則:減少全表掃描、善用索引、避免隱含轉換

     編輯:關於SqlServer

SQL 語句品質直接決定資料庫負載與回應速度。本文提煉 9 大優化鐵律,涵蓋欄位提取、存在性判斷、IN/EXISTS 抉擇、JOIN 替代、OR 陷阱、WHERE 順序、比較運算子選擇、索引失效模式、運算下推,附反面教材與正確寫法對照。

優化九大原則

1. 按需提取欄位,拒絕 SELECT *

-- 差
SELECT * FROM Orders;
-- 好
SELECT OrderID, CustomerID, OrderDate FROM Orders;

每減少一欄位即降低網路傳輸、記憶體佔用、緩衝區壓力。

2. 存在性判斷用 EXISTS,不用 COUNT(*)

-- 差
IF (SELECT COUNT(*) FROM Table WHERE ...) > 0
-- 好
IF EXISTS (SELECT 1 FROM Table WHERE ...)

EXISTS 支援短路:找到第一筆即停止,COUNT(*) 必須掃描所有符合列。

3. 優先用 (NOT) EXISTS 替代 (NOT) IN

-- 差 (IN 效能較低,NULL 值語義陷阱)
SELECT * FROM Dept WHERE DeptNo NOT IN (SELECT DeptNo FROM Emp);
-- 好 (EXISTS 穩定高效)
SELECT * FROM Dept WHERE NOT EXISTS (SELECT 1 FROM Emp WHERE Dept.DeptNo = Emp.DeptNo);

4. NOT IN 可用 LEFT OUTER JOIN 替代

SELECT D.*
FROM Dept D
LEFT JOIN Emp E ON D.DeptNo = E.DeptNo
WHERE E.DeptNo IS NULL;

JOIN 可利用索引與統計資訊,優化器選擇空間更大。

5. 避免 OR 導致全表掃描

-- 差:OR 通常使索引失效
SELECT * FROM Table WHERE Col1 = 'A' OR Col2 = 'B';
-- 好:UNION ALL 分開走索引再合併
SELECT * FROM Table WHERE Col1 = 'A'
UNION ALL
SELECT * FROM Table WHERE Col2 = 'B' AND Col1 <> 'A';

6. WHERE 條件順序:索引順序優先、範圍從大到小

  • 複合索引 (A, B, C) → WHERE 條件順序盡量符合 A, B, C。
  • 高選擇性 (範圍小) 條件前置,快速縮小結果集。

7. 優先用 >= 而非 >

-- 等價但 >= 可能利用索引邊界更精確
WHERE Id >= 100  -- 優於 WHERE Id > 99

8. 避免 WHERE 子句中導致索引失效的操作

失效模式範例修正
函數包裹欄位WHERE SUBSTRING(Id,1,1)='A'WHERE Id LIKE 'A%'
欄位參與運算WHERE Result*10 > 30WHERE Result > 3
隱含轉換WHERE VarcharCol = 123WHERE VarcharCol = '123'
負向運算子WHERE Col <> 'X', NOT IN, NOT EXISTS改用正向邏輯或 JOIN
IS NULLWHERE Col IS NULL考慮過濾索引或計算欄位

9. 欄位運算下推:移至等號右側

核心原則:WHERE 子句中任何對欄位的操作 (函數、計算) 都會導致索引失效,應盡可能將運算移至常數側。

總結:優化鐵三角

  1. 減少型別轉換與計算:欄位保持原樣,常數側做轉換。
  2. 充分利用索引:建立正確索引、避免失效模式、維護統計資訊。
  3. 減少全表掃描:EXISTS 替代 COUNT、JOIN 替代 IN、UNION 替代 OR、條件順序配合索引。

將這 9 原則內化為寫碼肌肉記憶,能從源頭消除 80% 以上的效能隱憂。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved