透過點陣圖篩選讓資料倉儲查詢效能最佳化

大部分資料倉儲查詢的設計都能遵循星型結構描述,而且可以在單一查詢中處理幾億個資料列。根據預設,查詢最佳化工具會偵測對星型結構描述發出的查詢,而且會針對這些查詢建立有效率的查詢計畫。最佳化工具可用來產生有效率之計畫的一個方法,就是使用點陣圖篩選。點陣圖篩選會在運算子樹狀結構的一部分中使用精簡方式顯示資料表中的一組值,以便從此樹狀結構的另一個部分中篩選第二個資料表中的資料列。基本上來說,此篩選會執行半聯結縮減;也就是說,只會處理第二個資料表中具備聯結第一個資料表之資格的資料列。

在 SQL Server 2008 中,點陣圖篩選可以在最佳化之後導入查詢計畫中 (如同 SQL Server 2005 中一樣),或是在查詢計畫產生期間由查詢最佳化工具動態導入。當動態導入此篩選時,就將它稱為「最佳化點陣圖篩選」。最佳化點陣圖篩選可藉由盡早將事實資料表中不合格的資料列移除,以大幅提升使用星型結構描述之資料倉儲查詢的效能。如果沒有最佳化點陣圖篩選,會先透過運算子樹狀結構的某個部分來處理事實資料表中的所有資料列,然後以維度資料表執行的聯結作業才會移除不合格的資料列。當套用最佳化點陣圖篩選時,會立即刪除事實資料表中不合格的資料列。

最佳化的點陣圖篩選僅適用於 SQL Server Enterprise、Developer 和 Evaluation 版本。

瞭解點陣圖篩選

點陣圖篩選與點陣圖索引相較之下更為理想。點陣圖索引是在值-清單索引中表示資料列識別碼 (RID) 清單的替代形式,其會使用一或多個位元向量來指示資料表中包含某個資料行值的資料列。這兩者在從結果處理中刪除不必要的資料列時,可能會非常有效;但是,點陣圖篩選和點陣圖索引之間有一些非常重要的差異。首先,點陣圖篩選是記憶體中的結構,所以不會發生因為對基礎資料表進行資料操作語言 (DML) 作業,而產生任何索引維護的負擔。此外,點陣圖篩選非常小,而且可以動態地加以建立,並對查詢處理時間產生最小的影響,與現有磁碟上的索引不同 (這些索引通常會根據其建立所在的資料表大小而定)。

比較點陣圖篩選與最佳化點陣圖篩選

點陣圖篩選和最佳化點陣圖篩選會在查詢計畫中使用點陣圖 Showplan 運算子來加以實作。只有在使用雜湊聯結或合併聯結的平行查詢計畫中,才會套用點陣圖篩選。最佳化點陣圖篩選只能套用到使用雜湊聯結的平行查詢計畫中。在這兩種情況下,點陣圖篩選會建立在雜湊聯結的建置輸入 (維度資料表) 端上;但是,實際篩選通常是在平行處理原則運算子內執行,這位於雜湊聯結的探查輸入 (事實資料表) 端上。當聯結以整數資料行為根據時,此篩選可直接套用到初始資料表或索引掃描作業,而不是平行處理原則運算子。這項技術稱為「同資料列的最佳化」。

當點陣圖篩選在最佳化之後導入查詢計畫時,查詢編譯時間會縮短;但是,最佳化工具可以考量的查詢計畫會受到限制,而且不會將基數和成本估計納入考量。

最佳化點陣圖篩選有下列優點:

  • 支援從數個維度資料表進行篩選。

  • 可以將多個篩選套用到單一運算子。

  • 最佳化點陣圖篩選可套用到多個運算子類型。這些包括交換運算子 (如散發資料流重新分割資料流運算子)、表格或索引掃描運算子及篩選運算子。

  • 篩選適用於 SELECT 陳述式及 INSERT、UPDATE、DELETE 和 MERGE 陳述式中所用的唯讀運算子。

  • 在用來擴展索引的運算子中,篩選適用於索引檢視表的建立。

  • 最佳化工具會使用基數和成本估計來判斷最佳化點陣圖篩選是否適合。

  • 最佳化工具可以考量更多計畫。

如何實作最佳化點陣圖篩選

只有當點陣圖篩選為選擇性時,才能發揮效用。查詢最佳化工具會判斷最佳化點陣圖篩選何時具有足夠的選擇性能夠充分發揮功用,以及篩選套用到哪個運算子。最佳化工具會將最佳化點陣圖篩選置於星型結構描述的所有分支上,並使用成本規則來判斷此計畫是否會提供最小的估計執行成本。當最佳化點陣圖篩選為非選擇性時,成本估計通常會過高,因此會捨棄此計畫。當考量要將最佳化點陣圖篩選置於計畫中的何處時,最佳化工具會尋找雜湊聯結變數,例如雜湊聯結的深入堆疊。會實作與維度資料表的聯結,以便先執行可能最具選擇性的聯結。

套用最佳化點陣圖篩選的運算子包含點陣圖述詞,其格式為 PROBE([Opt_Bitmap1001], {[column_name]} [, 'IN ROW'])。點陣圖述詞會報告下列資訊:

  • 對應至點陣圖運算子中導入之名稱的點陣圖名稱。前置詞 'Opt_' 指示已使用最佳化點陣圖篩選。

  • 探查所針對的資料行。這是篩選過的資料流過樹狀結構的起始點。

  • 點陣圖探查是否使用同資料列的最佳化。當有使用時,會使用 IN ROW 參數叫用點陣圖探查。否則,會遺漏這個參數。

範例

下列範例表示針對簡單星型結構描述所發出的查詢。DimProduct 和 DimCustomer 這兩個維度資料表會在單一整數資料行上使用主索引鍵與外部索引鍵的聯結,以聯結至 FactInternetSales 事實資料表。

USE AdventureWorksDW2008R2;
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) 篩選掉不合格資料列所需的資訊為已知。但是,資料表掃描運算子的屬性顯示,不會使用任何述詞來限制從事實資料表所傳回的資料列。

不具點陣圖篩選的 SQL Server 查詢計畫。

相較之下,下圖顯示相同查詢的執行計畫 (在 SQL Server 2008 中可能出現的面貌)。最佳化點陣圖運算子會用於這兩個維度資料表的子樹中。資料表掃描運算子的屬性顯示,這些子樹中的篩選 (點陣圖探查) 會直接套用到事實資料表樹狀結構,以限制在第一次聯結作業之前從事實資料表所傳回的資料列。

具點陣圖篩選的 SQL Server 查詢計畫。

最佳化點陣圖篩選的需求

最佳化點陣圖篩選的需求如下:

  • 事實資料表至少必須有 100 頁。最佳化工具會將較小的資料表視為維度資料表。

  • 只會考量事實資料表與維度資料表之間的內部聯結。

  • 事實資料表與維度資料表之間的聯結述詞必須是單一資料行聯結,但不必是主索引鍵與外部索引鍵的關聯性。整數式資料行是慣用的資料行。

  • 只有當維度輸入基數小於事實資料表中的輸入基數時,才會考量與維度的聯結。