摘要
Microsoft SQL Server 從版本
開始使用內置位圖來提高執行查詢的速度
通過在 SQL Server
中引入新的運算符
可以將進一步的位圖篩選技術應用於源自大型數據集的
更快速的查詢結果
簡介
本文首先介紹了在 Microsoft® SQL Server
的查詢優化中位圖的使用
然後介紹了它們在 SQL Server
; 中增強的應用
SQL Server
Microsoft SQL Server
在所有的散列聯接中無提示使用位圖
散列聯接包含創建和探測兩個階段
在創建階段
其中一個已聯接的表(也稱為外部表)的所有聯接鍵都被分布到一個散列表中
作為該散列操作的副產品
SQL Server 將生成一個獨立的位圖
其中
表示
外部表中沒有鍵值分布到該位
表示
外部表中有一個或多個鍵值分布到該位
位圖的大小是在根據外部表中唯一值的數量而進行的優化查詢過程中決定的
一旦外部表中所有的行都被散列後
位圖就由
和
組成
然後將使用與處理外部鍵相同的散列算法對探測表(也稱為內部表)中的每個鍵進行分布
在檢查和搜索創建階段的散列表之前
我們將先檢查位圖
如果對應的條目為
則該行在外部表中不可能有匹配值
因此將被丟棄
由於搜索位圖要比搜索散列表更經濟
處理不生成聯接記錄的內部表中的行要比處理不帶位圖的行快
由於位圖是散列聯接不可分割的一部分
因此位圖將自動創建並且不會顯示在顯示方案的輸出中
SQL Server
Microsoft SQL Server
非常有效地使用了類似的位圖
不僅在內部散列聯接中使用
而且還用於外部聯接運算符以刪除包含不能生成任何聯接記錄的鍵值的行
在創建位圖的顯示方案輸出中
有一個
Bitmap Create
運算符
在查詢優化過程中
位圖被自動引用到查詢計劃中
以下查詢示例便使用了包含這些位圖的計劃
SELECT S_NAME
S_ADDRESS
S_PHONE
S_COMMENT
PS_PARTKEY
FROM SUPPLIER
PARTSUPP
WHERE S_SUPPKEY = PS_SUPPKEY AND
PS_PARTKEY between
AND
該查詢從 SUPPLIER 表中選擇所有供應商
這些供應商生產
系列中的所有部件(部件鍵值在
到
之間)
除 SUPPLIER 表外
我們還使用 PARTSUPP(部件供應商)表
它包含了(針對每個部件)生產同一部件的不同供應商的所有記錄
圖
顯示了由 SQL Server
生成的顯示方案圖解
圖
示例查詢的執行計劃圖解
對於每個數據流
位圖都在聯接的外部輸入端上的散列聯接之前創建
從左至右和從上至下查看上面的顯示計劃圖解
將發現 PARTSUPP 表的掃描是並行的
後面的交換運算符 (Parallelism/Repartition Streams) 使用鍵值分配行
這樣它們將在並行的散列匹配(聯接)之前被置於包含 SUPPLIER 表的再分配行的對應流中
先執行頂部分支
直至散列聯接的散列表被填充
底部分支沒有活動為止
在掃描 SUPPLIER 表時
我們已使用 PARTSUPP 鍵(在本查詢中為 PS_SUPPKEY 列)在頂部分支上創建了位圖
每一個進入散列聯接的流都有一個位圖
當 SUPPLIER 行在掃描後輸入交換運算符時
我們首先要判斷它們將進入哪一個流
如果在對應於鍵值(S_SUPPKEY 列)的項目中該行的位圖包含
則丟棄該行
因此
在被置於適當的交換輸出流之前
不符合條件的行將被刪除
SQL Server
只在並行查詢計劃中使用這些位圖
這是因為如果沒有交換運算符
則在散列聯接中的位圖上沒有額外的補償
除了上述使用散列聯接的方案外
SQL Server
還在合並聯接中使用這些位圖
但仍然只限於並行計劃
並且在外部分支上存在 SORT 運算符
SORT 運算符使 SQL Server 在處理內部表中的行之前先處理所有外部行
因此使我們可以創建位圖
如果在外部分支上沒有 SORT 運算符
將同時處理合並聯接中來自內部表和外部表中的行
這樣就不能使用位圖了
測試結果顯示速度的提高
通常
由於采用位圖而產生的性能提高取決於被篩選出的行數
該數目是可以變化的
因此根據查詢執行中其他運算符的開銷的不同
速度提高的幅度可以從小到無法測量到非常顯著
圖
顯示了在大型數據庫(
GB 的表
GB 的索引)中測試三種復雜查詢時所觀察到的速度提高
測試是在實驗室中使用 RAM 為
GB 的
路
MHz 計算機完成的
查詢 A 為包含結果匯總和排序的三個表(最大的表大約包含
GB 數據)的聯接查詢
查詢 B 為包含相關子查詢的查詢
查詢 C 為在聯接頂部包含匯總的六個表的聯接查詢
圖
位圖篩選對三個大型數據庫的復雜查詢的優化
結論
在查詢優化過程中使用位圖是 SQL Server
采用的眾多技術之一
旨在從大型數據集(如企業數據庫中的數據集)中最快的獲取查詢結果
通過減少需要處理的行數
使內部聯接和外部聯接查詢更有效
迅速返回數據的同時還減少了服務器處理的工作量
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22086.html