SQL Server 企業版引入高級掃描,允許同一張表的多個全表掃描共享 I/O,顯著降低重複讀取開銷。本文通過三用戶並發案例,詳細拆解共享機制、順序混亂根因、排序修正成本分析、影響因子與適用場景。
一、高級掃描工作原理演示
場景
表 40,000 頁。用戶甲發起全表掃描,掃至 20,000 頁時用戶乙加入,30,000 頁時用戶丙加入。
無高級掃描
- 三次完整全表掃描,總讀取 120,000 頁
- 用戶乙/丙需等待前者完成,串行延遲
有高級掃描
- 掃描 1-20,000 頁:僅服務用戶甲
- 掃描 20,001-30,000 頁:生成兩份副本,服務甲+乙
- 掃描 30,001-40,000 頁:生成三份副本,服務甲+乙+丙
- 掃描結束:返回用戶甲結果
- 二次掃描 1-20,000 頁:合併 20,001-40,000 頁結果,返回用戶乙
- 二次掃描 1-30,000 頁:合併 30,001-40,000 頁結果,返回用戶丙
- 總讀取 < 80,000 頁,較無共享節省 33%+ I/O
二、實現機制:掃描插入與副本分發
- 優化器檢測到同表活躍掃描 → 將新掃描「插入」現有掃描當前位置
- 單次頁讀取 → 行數據分發給多個執行計劃
- 首個掃描結束 → 返回結果;後續掃描需「繞回」補掃插入點前頁面(防止數據變更導致髒讀)
- 支持任意數量掃描鏈式組合,類似「走馬燈」循環
三、副作用:結果順序混亂
根因
用戶乙首次接收數據從第 20,001 行開始,補掃前 20,000 行在最後;用戶丙同理。最終順序:甲 1→N,乙 20001→N→1→20000,丙 30001→N→1→30000。
修正策略對比
| 策略 | 成本 | 適用性 |
ORDER BY 顯式排序 | 額外排序開銷(CPU/TEMPDB),部分抵消掃描收益 | 業務強制要求順序 |
| 無序接受 + 應用層排序 | 零數據庫開銷,應用層承擔 | 報表導出、數據同步等無序不敏感場景 |
聚合函數 GROUP BY | 隱式排序,同 ORDER BY 開銷 | 統計類查詢 |
結論
即使加排序,總開銷仍遠低於多次全表掃描。建議:默認啟用高級掃描,業務需序時顯式 ORDER BY。
四、影響效果的關鍵因子
- 並發參與度:掃描期間加入的查詢越多,共享收益越大
- 表大小/掃描時長:大表掃描時間長 → 更多查詢可加入 → 累積效應
- 時間窗口集中度:業務批量報表集中時段觸發 → 效果最佳
五、典型適用場景
- ERP 產品主數據表(百萬行),多部門並發導出報表
- 數據倉庫維度表刷新,多 ETL 任務並發全表讀取
- 歸檔/備份窗口,多表並發全量抽取
高級掃描是「以空間換時間、以協作替代競爭」的經典體現,需業務節奏配合才能發揮最大價值。