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

SQL 執行效率優化 20 條鐵律:從 WHERE 條件順序到索引使用、統計信息、執行計劃深度解析

     編輯:關於SqlServer

查寫與邏輯優化

  1. 避免 WHERE 中子查詢:改用 JOIN、EXISTS、APPLY、CTE、臨時表,減少重複掃描。
  2. 時間查詢用範圍而非函數:
    ❌ WHERE CONVERT(DATE, CreateTime) = '2024-01-15'
    ✅ WHERE CreateTime >= '2024-01-15' AND CreateTime < '2024-01-16'(SARGable,可用索引)。
  3. 過濾性最強條件放 WHERE 末尾:優化器自動調整順序,但舊版本/複雜查詢手寫順序仍有影響。
  4. FROM 子句最後的表優先處理:選擇行數最少的表作驅動表(基礎表);三表以上連接選交叉表(被多表引用的表)作驅動表。
  5. 使用綁定變量/參數化查詢:復用執行計劃,防 SQL 注入,減少編譯開銷。
  6. WHERE 中盡量不用 OR:導致索引失效,改用 UNION ALL 或 IN。
  7. 用 EXISTS 替代 IN、NOT EXISTS 替代 NOT IN:NOT IN 遇 NULL 返回空集,邏輯陷阱;EXISTS 半連接,匹配即停止,性能更穩定。
  8. 避免索引列計算:
    ❌ WHERE Salary * 12 > 25000
    ✅ WHERE Salary > 25000 / 12 或建計算列 + 索引。
  9. 用 IN 替代多個 OR:WHERE Status IN (1,2,3) 優化器易轉為索引查找。
  10. 避免索引列 IS NULL/IS NOT NULL:通常導致掃描;改用預設值+約束或過濾索引 WHERE Status IS NOT NULL。
  11. 總是使用組合索引首列:索引 (A,B,C),查詢必須包含 A 才能用到索引。
  12. UNION ALL 替代 UNION:UNION 會去重(Sort/Distinct),UNION ALL 直接合並,無去重開銷。
  13. 避免隱式類型轉換:
    ❌ WHERE EmpNo = '123'(EmpNo 為 INT)→ CONVERT(VARCHAR, EmpNo) = '123' 導致掃描
    ✅ WHERE EmpNo = 123 或參數化強類型。
  14. != / <> 不走索引:改用 WHERE Status < 1 OR Status > 1(極少數值時)或全表掃描不可避免則接受。
  15. 優化 GROUP BY:僅選需要列、預先過濾、適當索引 (GroupCol, AggCol)。
  16. LIKE 通配符前置不走索引:LIKE 'ABC%' 走索引,LIKE '%ABC'、LIKE '%ABC%' 不走。全文搜索用全文索引/ES。
  17. 避免複雜正則:WHERE Zip LIKE '98___' → WHERE Zip BETWEEN '98000' AND '98999' 走索引。
  18. 明確列名,禁用 SELECT *:減少網絡傳輸、避免覆蓋索引失效、便於重構。
  19. 按數據庫習慣組織 SQL:大寫關鍵字、縮進、別名、註釋,利於團隊維護與優化器解析。

索引與統計信息維護

  • 統計信息自動更新:AUTO_UPDATE_STATISTICS ON,大表啟用 AUTO_UPDATE_STATISTICS_ASYNC ON 避免查詢等待。
  • 手動更新熱點表統計:UPDATE STATISTICS TableName WITH FULLSCAN(維護窗口)。
  • 索引碎片整理:sys.dm_db_index_physical_stats 檢測,>30% 重建,5-30% 重組。
  • 填充因子:高寫入表 FILLFACTOR = 80-90 減少頁分裂。

執行計劃核心算子識別

算子含義優化方向
Table Scan / Clustered Index Scan全表掃描加索引、縮小範圍、分區剪枝
Index Seek索引查找(理想)覆蓋索引避免 Key Lookup
Key Lookup (Bookmark Lookup)回表查詢非索引列INCLUDE 列建覆蓋索引
Hash Match / Merge Join大表連接確保連接鍵有索引、統計信息新鮮
Sort / Distinct排序/去重索引順序滿足 ORDER BY、UNION ALL 替代 UNION
Spool / Eager Spool臨時存儲中間結果重寫查詢、拆分邏輯、優化 TempDB
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved