通過點陣圖篩選優化資料倉儲查詢效能

iSQlServer發表於2008-11-26

大多數資料倉儲查詢都設計為遵循星型架構並且可以在單個查詢中處理數億行。預設情況下,查詢優化器可根據星型架構檢測查詢,並且可為這些查詢建立有效的查詢計劃。優化器可用來生成有效計劃的一種方法是使用點陣圖篩選。點陣圖篩選器使用運算子樹某部分的表中一組值的簡潔表示形式來篩選位於該樹另一部分的第二張表中的行。實際上,該篩選器執行半聯接減法;即僅處理第二張表中符合到第一張表的聯接要求的行。

在 SQL Server 2008 中,可在優化後將點陣圖篩選引入查詢計劃(這與在 SQL Server 2005 中一樣),或者在查詢計劃生成期間通過查詢優化器動態引入點陣圖篩選。當動態引入篩選器時,此篩選器即被稱為“已優化的點陣圖篩選器”。優化的點陣圖篩選可在查詢計劃早期刪除事實資料表中不符合要求的行,從而明顯提高使用星型架構的資料倉儲查詢的效能。如果不使用優化的點陣圖篩選,將先通過運算子樹的某部分來處理事實資料表中的所有行,然後通過維度表的聯接操作刪除不符合要求的行。應用優化的點陣圖篩選後,將立即刪除事實資料表中不符合要求的行。

優化點陣圖篩選功能僅在 SQL Server 的 Enterprise Edition、Developer Edition 和 Evaluation Edition 中提供。

 瞭解點陣圖篩選
與點陣圖索引相比,點陣圖篩選器更具優勢。點陣圖索引是表示值列表索引中的行 ID (RID) 列表的另一種形式,它使用一個或多個位向量來指示表中的哪一行包含特定的列值。兩者在從結果處理中刪除不必要的行時都很有效,但是點陣圖篩選器和點陣圖索引之間存在一些重要的差異。首先,點陣圖篩選器是記憶體中的結構,由於對基礎表進行了資料操作語言 (DML) 操作,因此消除了所有的索引維護開銷。此外,點陣圖篩選器非常小,並且與現有的磁碟索引(通常取決於生成索引時所基於的表的大小)不同,可動態建立點陣圖篩選器,而且對查詢處理時間的影響可降到最低。

比較點陣圖篩選和優化的點陣圖篩選
通過使用 bitmap showplan 運算子可在查詢計劃中實現點陣圖篩選和優化的點陣圖篩選。點陣圖篩選僅應用於使用雜湊聯接或合併聯接的並行查詢計劃。優化的點陣圖篩選只適用於使用雜湊聯接的並行查詢計劃。在這兩種情況下,點陣圖篩選器是在雜湊聯接的生成輸入(維度表)側建立的;但是,實際篩選通常是在 Parallelism 運算子內完成的,該運算子位於雜湊聯接的探測輸入(事實資料表)側。聯接基於整數列時,篩選器可直接應用於初始表或索引掃描操作,而不是 Parallelism 運算子。這種方法稱為“行內優化”。

在經過優化之後將點陣圖篩選引入查詢計劃,可減少查詢編譯時間;但是,優化器可考慮使用的查詢計劃會因此受限,並且不會考慮基數估計和開銷估計。

優化的點陣圖篩選器具有以下優點:

支援從多個維度表中進行篩選。

可將多個篩選器應用到單個運算子。

優化的點陣圖篩選器可應用於多種運算子型別。這些運算子包括交換運算子,例如 Distribute Streams 和 Repartition Streams 運算子、table scan 或 index scan 運算子以及 filter 運算子。

篩選適用於 SELECT 語句以及在 INSERT、UPDATE、DELETE 和 MERGE 語句中使用的只讀運算子。

篩選適用於在用於填充索引的運算子中建立索引檢視。

優化器使用基數估計和開銷估計來確定優化的點陣圖篩選是否合適。

優化器可以支援多個計劃。

如何實現優化的點陣圖篩選
只有點陣圖篩選器具有選擇性時才有用。查詢優化器將確定優化的點陣圖篩選器何時具有足夠的選擇性以滿足使用需求,以及該篩選器將應用於哪些運算子。該優化器將把優化的點陣圖篩選器置於星型聯接的所有分支上,並使用開銷規則來確定此計劃是否將提供最小的估計執行開銷。當優化的點陣圖篩選器不具有選擇性時,開銷估計值通常會很高,並且將放棄該計劃。在考慮將優化的點陣圖篩選器置於計劃中的什麼位置時,優化器將查詢雜湊聯接變數,例如雜湊聯接的右深堆疊。實現與維度表的聯接以首先執行選擇性最大的聯接。

應用了優化的點陣圖篩選器的運算子包含點陣圖謂詞,其格式為 PROBE([Opt_Bitmap1001], {[column_name]} [, 'IN ROW'])。點陣圖謂詞可報告以下資訊:

與 Bitmap 運算子中引入的名稱對應的點陣圖名稱。字首“Opt_”表示使用了優化的點陣圖篩選器。

探測的列。這是已篩選資料流過樹時所經過的點。

點陣圖探測是否使用行內優化。如果使用行內優化,則使用 IN ROW 引數呼叫點陣圖探測。否則將缺失此引數。

示例
下面的示例表示對簡單星型架構的查詢。以下兩個維度表 DimProduct 和 DimCustomer 通過對單個整數列使用主鍵到外來鍵聯接從而聯接到事實資料表 FactInternetSales。

 複製程式碼
USE AdventureWorksDW;
GO
SELECT *
FROM dbo.FactInternetSales AS F
INNER JOIN dbo.DimProduct AS D1 ON F.ProductKey = D1.ProductKey
INNER JOIN dbo.DimCustomer AS D2 ON F.CustomerKey = D2.CustomerKey
WHERE D1.StandardCost <= 30 AND D2.YearlyIncome <= 50000;下圖顯示了此查詢的執行計劃,它與 SQL Server 2005 中顯示的執行計劃可能相同。在標記為 1A 的點上,已對維度表進行掃描,並且已知從事實資料表 (1B) 中篩選出不符合要求的行所需的資訊。但是,Table Scan 運算子的屬性顯示沒有使用任何謂詞來限制從事實資料表中返回的行。


與之相反,下圖顯示了同一查詢的執行計劃,它與 SQL Server 2008 中顯示的執行計劃可能相同。在這兩個維度表的子樹中使用了 Optimized bitmap 運算子。table scan 運算子的屬性顯示這些子樹中的篩選器(點陣圖探測)將直接應用於事實資料表樹,從而在執行第一個聯接操作之前限制從事實資料表中返回的行。


 優化的點陣圖篩選的要求
優化的點陣圖篩選具有以下要求:

事實資料表應至少有 100 頁。優化器將較小的表視為維度表。

只考慮事實資料表和維度表之間的內部聯接。

事實資料表和維度表之間的聯接謂詞必須是單個列聯接,但不要求是主鍵到外來鍵的關係。優先採用基於整數的列。

只有維度輸入基數小於事實資料表中的輸入基數時,才考慮與維度的聯接。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-503356/,如需轉載,請註明出處,否則將追究法律責任。

相關文章