| 維度 | 序號範圍 | 核心關鍵詞 |
|---|---|---|
| 索引與統計 | 1, 3, 4, 8, 10, 13, 22, 24, 26, 40 | 缺失索引、統計過期、填充因子、計算列、參數嗅探、覆蓋索引 |
| 硬件與資源 | 2, 4, 6, 7, 44, 46 | I/O 瓶頸、內存壓力、CPU 飽和、線程池、磁盤隊列、緩存命中率 |
| 鎖與併發 | 7, 8, 12, 31, 45 | 死鎖、阻塞、事務長短、鎖升級、訪問順序一致性 |
| 查詢寫法與邏輯 | 9, 14, 17, 18, 19, 20, 21, 25, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 47, 48 | SELECT *、DISTINCT/ORDER BY 濫用、UNION/UNION ALL、子查詢 vs JOIN、臨時表 vs 表變量、動態 SQL、函數調用、隱式轉換 |
| 架構與配置 | 5, 11, 15, 16, 23, 41 | 網絡延遲、文件組分離、游標濫用、Profiler/XEvents、查詢成本限制、存儲過程優先 |
| 數據類型與隱式轉換 | 47, 48 | 數值/字符隱式轉換、聯接列類型不匹配、SARGable 條件破壞 |
| 指標 | 來源 | 告警閾值 | 排查動作 |
|---|---|---|---|
| Page Life Expectancy (PLE) | PerfMon: Buffer Manager | < 300 秒 | 內存壓力,檢查大查詢/索引掃描/緩存刷新 |
| Batch Requests/sec | PerfMon: SQL Statistics | 基線 ±50% | 負載突變,關聯應用發布/慢查詢 |
| Lock Waits/sec / Deadlocks/sec | PerfMon: Locks / DMV sys.dm_os_wait_stats | > 0 持續 | 分析死鎖圖、優化索引/事務順序 |
| Avg Disk sec/Read/Write | PerfMon: Physical Disk | > 20 ms | I/O 瓶頸,檢查磁盤/文件組/Tempdb/索引碎片 |
| CPU % Privileged Time | PerfMon: Processor | > 30% | 內核態高,驅動/中斷/系統調用,排查硬件/防毒/備份壓縮 |
| Cache Hit Ratio | PerfMon: Buffer Manager / DMV sys.dm_os_buffer_descriptors | < 90% | 緩存未命中,檢查大掃描/參數嗅探/內存不足 |
| wait_type: CXPACKET / SOS_SCHEDULER_YIELD / PAGEIOLATCH_* | DMV sys.dm_os_wait_stats | 累計佔比 > 20% | 並行度/CPU/IO 綜合分析 |
| 誤區 | 真相 |
|---|---|
| 索引越多越好 | 寫入開銷線性增長、統計維護成本、優化器搜索空間爆炸,精準創建、定期清理未用索引 |
| NOLOCK 解決所有阻塞 | 髒讀/幻讀/缺失行/重複行,核心業務禁用,僅報表類評估 |
| 存儲過程天然快 | 僅計劃緩存復用優勢,邏輯差同樣慢,需同等優化 |
| COUNT(*) 極慢必優化 | 大表 `COUNT(*)` 必然掃描,業務接受近似值用 `sys.dm_db_partition_stats` / 觸發器維護計數表 |
| 動態 SQL 不可參數化 | `sp_executesql` 完美支持參數化,拒絕字符串拼接 |
SQL 查詢優化是**系統工程**,而非單點技巧。建立「監控基線 → 定期巡檢 → Top N 攻堅 → 變更驗證 → 知識沉澱」閉環,將 48 類根因轉化為可度量、可預防、可自動化的運維體系,才是高可用高性能數據庫的長久之道。