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

SQL Server 查詢緩慢十大成因與優化實戰清單

     編輯:關於SqlServer

核心成因速查表

#成因類別典型徵兆優先處理建議
1缺索引/索引失效全表掃描、Key Lookup 過多依查詢條件建立覆蓋索引,檢查 SARGable 條件
2I/O 瓶頸PAGEIOLATCH_* 等待高、磁碟佇列長度大資料/記錄/索引分離不同磁碟,考慮 SSD/RAID
3缺計算欄位導致掃描WHERE 子句含函數(SUBSTRING, CONVERT)建立計算欄位+索引,或改寫為 SARGable 形式
4記憶體不足Buffer Cache Hit Ratio 低、Plan Cache 壓力大擴充實體記憶體,設定 Max Server Memory
5網路延遲ASYNC_NETWORK_IO 等待、大量資料傳輸分頁/篩選縮減回傳資料量,啟用壓縮
6回傳資料過大單次查詢回傳數萬列分批查詢、僅選必要欄位、避免 SELECT *
7鎖爭用/死鎖LCK_M_* 等待、死鎖圖頻繁縮短交易範圍、調整隔離等級、優化索引減少掃描
8鎖監控盲區無法快速定位阻塞鏈善用 sp_who2, sp_lock, DMV sys.dm_tran_locks
9多餘欄位/列SELECT *、未過濾不必要行明確列出欄位,WHERE 子句下推
10查詢寫法不佳巢狀子查詢、隱性轉換、OR/IN 濫用改寫為 JOIN、APPLY、CTV、參數化

架構層面優化策略

儲存層分離

  • 資料、記錄、索引、Tempdb 放置於不同物理磁碟/RAID 群組,平衡 I/O 負載。
  • 大型資料庫採用檔案群組將熱門資料表獨立存放。

資料表分割

  • 垂直分割:將大欄位(BLOB、長文本)移至獨立表,主表保留高頻欄位。
  • 水平分割:依時間/範圍分割歷史與熱門資料,配合分區視圖或 PARTITION FUNCTION (Enterprise) 實現透明查詢。

硬體升級

  • 記憶體:Win2000/SQL2000 支援 4-8GB,設定虛擬記憶體 = 實體 1.5 倍(含全文檢索則 3 倍)。
  • CPU:增加核心數可提升並行度,但並行查詢需更多記憶體,須平衡配置。注意 UPDATE/INSERT/DELETE 不支援並行。

T-SQL 撰寫黃金法則

  1. WHERE 子句下推:盡早過濾,避免大結果集產生後再篩選。
  2. 避免光標:改用集合操作、Table Variable、CTE、CASE 表達式。
  3. UNION ALL > UNION:除非需要去重,否則永遠用 ALL 避免排序開銷。
  4. 慎用 DISTINCT:同 UNION,會觸發排序/雜湊去重。
  5. LIKE 模糊查詢優化:
    • LIKE 'abc%' → 可用索引
    • LIKE '%abc' / LIKE '%abc%' → 全掃描,改用全文索引或前綴搜尋架構
    • 長字串欄位用 VARCHAR 而非 CHAR,減少掃描位元組
  6. 隔離等級選擇:報表查詢可用 READ UNCOMMITTED (NOLOCK) 降低阻塞,但需接受髒讀風險。
  7. 限制資源消耗:SET QUERY_GOVERNOR_COST_LIMIT、SET ROWCOUNT、TOP N 防止失控查詢。
  8. NOT IN / NOT EXISTS 陷阱:含 NULL 時語意不同,優先用 NOT EXISTS 或 LEFT JOIN ... WHERE IS NULL。
  9. 函數與索引:WHERE SUBSTRING(col,1,1)='m' → 改寫 WHERE col LIKE 'm%';必須用函數時建立計算欄位+索引。
  10. 定期維護:DBCC REINDEX, INDEXDEFRAG, SHRINKFILE(慎用自動收縮)。

監控與診斷工具鏈

  • SQL Profiler / Extended Events:捕捉高耗時查詢、參數嗅探問題。
  • Database Engine Tuning Advisor (DTA):自動推薦索引/統計資訊,但需人工審核。
  • DMV 核心查詢:
    • sys.dm_exec_query_stats:累積耗時/IO/CPU 排名
    • sys.dm_exec_requests:即時阻塞/等待分析
    • sys.dm_db_index_usage_stats:索引使用率/維護成本評估

總結:優化是系統工程

查詢調優不是單點修補,而是「索引設計 → 查詢改寫 → 架構分層 → 硬體規劃 → 監控迴授」的持續循環。遵循 80/20 原則:聚焦 20% 耗資源最多的查詢,通常能解決 80% 效能問題。

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