慢查詢十大根因
- 缺索引 / 索引失效 (隱式轉換、函數包裹列、不等值/前導模糊)
- I/O 子系統瓶頸 (磁盤延遲、隊列、吞吐飽和)
- 缺計算列 / 持久化計算列導致重複表達式求值
- 內存壓力 (緩存命中率低、計劃緩存膨脹、內存授予等待)
- 網絡延遲/帶寬限制 (大結果集、頻繁往返)
- 單次返回過大結果集 (缺分頁、缺投影列裁剪)
- 鎖/死鎖/阻塞 (長事務、索引缺失導致掃描鎖升級、隔離級別不當)
- 系統表爭用 (sp_lock/sp_who 高頻、元數據鎖)
- 不必要的行/列返回 (SELECT *、未過濾提前物化)
- 查詢寫法低效 (子查詢 vs 連接、缺聯合索引、OR 謂詞阻礙索引)
優化五大戰略維度
1. 存儲層優化
- 數據/日誌/索引/TempDB 分離不同 I/O 設備 (RAID 10/NVMe)
- 縱向分表 (冷熱列分離) / 橫向分表 (分區表/分區視圖/分片)
sp_spaceused 監控表尺寸,大表歸檔策略
2. 硬件升級
- 內存:Win2000/SQL2000 支援 4-8GB (AWE/PAE),配置虛擬內存 1.5x 物理 (全文檢索 3x),Max Server Memory 設 1.5x 物理 (虛擬內存一半)
- CPU:並行度由優化器自動評估 (復雜掃描/排序/連接/聚合適合並行,DML 不並行),N UMA 架構注意親和性
3. 索引與訪問路徑
- 按查詢謂詞建索引,填充因子默認 (0) 通常最優
- 索引鍵越窄越好 (優先小數據類型列)
- 低基數列 (性別/狀態) 單列索引無效,考慮篩選索引/組合索引
- LIKE 優化:
'abc%' 用索引,'%abc'/'%abc%' 全掃描 → 全文索引/語義搜索
- 長字符串列改 VARCHAR 非 CHAR,超長文本建全文索引
4. 架構解耦
- DB Server / App Server 物理分離
- OLTP / OLAP 工作負載分離 (複製/鏡像/AlwaysOn 可讀副本)
- 分布式分區視圖構建服務器聯盟 (水平分區表 + 同名視圖),透明擴展讀寫
5. 代碼與配置微調
- 參數化查詢 → 計劃重用、防注入
- 避免游標/WHILE 循環 → 集合操作
- 事務最小化:短持有、少鎖定、避免用戶交互中持有事務
- 適當隔離級別:讀已提交快照 (RCSI) 減少讀寫阻塞
- 統計信息維護:自動創建/更新 + 定期 FULLSCAN 重建
- 計劃緩存監控:
sys.dm_exec_cached_plans、DBCC FREEPROCCACHE 謹慎使用
執行清單
建立「優化待辦看板」:收集慢查詢 (查詢存儲/擴展事件) → 根因分類 (上述 10 類) → 關聯戰略維度 → 制定動作 → 驗證基線對比 → 固化最佳實踐。拒絕「撞大運式優化」,建立「度量-分析-改進-驗證」閉環。