前言
位圖 在 SQL Server 查詢優化器中扮演關鍵角色,特別是雜湊聯接與星狀結構查詢。SQL Server 7.0 首創於雜湊聯接內部使用位圖;SQL Server 2000 大幅增強,將位圖應用於外部聯接運算子、平行查詢、星狀結構篩選,並可在執行計畫中以 Bitmap Create / Bitmap Filter 運算子顯式觀察。
SQL Server 7.0:雜湊聯接內建位圖
- 建構階段:外部表 (Build Input) 所有聯接鍵雜湊分佈到雜湊表,同時產生位圖 — 每個位對應一個雜湊槽,
1 表示該槽有鍵值,0 表示無。
- 探測階段:內部表 (Probe Input) 每行鍵值以相同雜湊函數映射到位圖。若對應位為
0,直接捨棄該行,完全避開雜湊表查找。
- 優勢:位圖極小 (通常數 KB),記憶體/快取友善,檢查成本遠低於雜湊表。位圖為雜湊聯接不可分割部分,不顯示於執行計畫。
SQL Server 2000:位圖增強與顯式化
1. 擴展至外部聯接與星狀結構
位圖不再限於內部雜湊聯接,可用於 LEFT/RIGHT/FULL OUTER JOIN 刪除無法產生聯接行的內部表行,以及 星狀結構事實表與維度表聯接 的維度篩選。
2. 執行計畫可見:Bitmap Create / Bitmap Filter
範例查詢:
SELECT S_NAME, S_ADDRESS, S_PHONE, S_COMMENT, PS_PARTKEY
FROM SUPPLIER, PARTSUPP
WHERE S_SUPPKEY = PS_SUPPKEY
AND PS_PARTKEY BETWEEN 5000 AND 5999;
執行計畫 (圖 1) 顯示:

圖 1:星狀結構查詢執行計畫與位圖運算子
3. 平行查詢中的位圖傳遞
- Repartition Streams:依聯接鍵重新分佈資料流,確保相同鍵值落在同一執行緒。
- Bitmap Create:在聯接建構端 (維度表掃描後) 產生位圖。
- Bitmap Filter:在事實表掃描端 (平行掃描前) 套用位圖,提前過濾 90%+ 不符合維度條件的行,大幅降低下游聯接與聚合成本。
- 位圖在執行緒間透過共享記憶體高效傳遞,無序列化開銷。
星狀結構查詢位圖優化完整流程
- 掃描維度表 (如
PARTSUPP 篩選 PS_PARTKEY BETWEEN 5000 AND 5999)。
- 建構雜湊表同時產生位圖 (Bitmap Create)。
- 平行掃描事實表 (
SUPPLIER) 時,每執行緒套用位圖 (Bitmap Filter)。
- 僅通過位圖檢查的行進入雜湊聯接 (Hash Match)。
- 最終結果聚合/輸出。
位圖大小與精度權衡
- 位圖大小 = 雜湊槽數 (通常 2 的冪次,如 8192、16384 位 = 1-2 KB)。
- 槽數越大 → 碰撞率越低 → 過濾精度越高 → 記憶體佔用越大。
- 優化器根據外部表基數、可用記憶體動態決定。
實務觀察與調校建議
- 查看執行計畫 XML:搜尋
<BitmapCreate>、<BitmapFilter> 節點,確認位圖是否生效。
- 星狀結構必備:維度表建立叢集索引於聯接鍵,事實表建立非叢集索引於外鍵,配合位圖效能最大化。
- 平行度 (MAXDOP):位圖在平行查詢效益最高;若 MAXDOP=1 位圖仍會建立但無平行過濾效益。
- 追蹤旗標 9498 (非公開) 可停用位圖優化,僅供診斷比對使用。
總結
SQL Server 2000 將位圖從「雜湊聯接內部優化」昇級為「可見、可跨運算子傳遞、支援平行與星狀結構」的核心優化技術。理解 Bitmap Create → Bitmap Filter 流程,能幫助 DBA 診斷星狀查詢效能瓶頸、驗證索引設計、調整平行度策略,是資料倉儲與 BI 工作負載調校的必備知識。