ビットマップ フィルターを含んだ実行プランの解釈

ビットマップ フィルターが使用されている並列クエリの実行プランでは、1 つ以上の操作サブツリーに Bitmap 操作が存在します。ビットマップ フィルターは、操作ツリーの特定の部分にあるテーブルから得られた一連の値の圧縮表現を使用して、同じツリーの別の部分にある 2 つ目のテーブルから行を抽出します。不要な行をクエリの初期段階で排除することにより、それ以降の操作に渡される行数が減り、その結果、クエリの全体的なパフォーマンスが向上します。

SQL Server 2008 では、SQL Server 2005 と同様、ビットマップ フィルターは、最適化後のクエリ プランで導入できるほか、並列クエリ プランの生成中にクエリ オプティマイザーで動的に導入することもできます。フィルターを動的に導入することを最適化されたビットマップ フィルターと呼びます。クエリ プランには、ビットマップ フィルターと最適化されたビットマップ フィルターの両方が含まれる場合もあります。クエリ オプティマイザーは、どのような場合に、ビットマップ フィルターまたは最適化されたビットマップ フィルターの選択度が効果を期待できる程度に高くなるか、また、どのような操作にフィルターを適用すべきかを判断します。詳細については、「ビットマップ フィルターを使ったデータ ウェアハウスのクエリ パフォーマンスの最適化」を参照してください。

ビットマップ フィルターを含んだ実行プランを解析する場合、実行プランのデータ フローとフィルターの適用箇所を理解することが大切です。ビットマップ フィルターも最適化されたビットマップ フィルターも、ハッシュ結合のビルド入力 (ディメンション テーブル) 側に作成されます。ただし、実際のフィルター処理は、ハッシュ結合のプローブ入力 (ファクト テーブル) 側にある Parallelism 操作内で実行されるのが一般的です。ただし、整数型の列に基づくビットマップ フィルターの場合、フィルターは Parallelism 操作ではなく、初期テーブルまたはインデックス スキャン操作に直接適用できます。この手法を行内最適化と呼びます。

プラン表示でのビットマップ フィルターの確認

クエリ プラン内のビットマップ フィルターを確認するには、SET オプション SHOWPLAN_ALL、SHOWPLAN_TEXT、または SHOWPLAN_XML を使用するか、SQL Server Management Studio の [実際の実行プランを含める] をクリックします。

XML プラン表示を生成すると、物理ビットマップ操作と論理ビットマップ操作が次のように列挙されます。

<RelOp NodeId="2" PhysicalOp="Bitmap" LogicalOp="Bitmap Create" EstimateRows="88" EstimateIO="0" EstimateCPU="0.0718125" AvgRowSize="6893" EstimatedTotalSubtreeCost="0.229385" Parallel="1" EstimateRebinds="0" EstimateRewinds="0">

ビットマップ フィルターが適用された操作には、Probe Column プロパティにビットマップの名前が存在します。

最適化されたビットマップ フィルターが適用された操作には、PROBE([Opt_Bitmap1001], {[column_name]} [, 'IN ROW']) という形式のビットマップ述語が存在します。ビットマップ述語は、次の情報をレポートします。

  • Bitmap Create 操作で導入された名前に対応するビットマップ名。プレフィックス 'Opt_' は、最適化されたビットマップ フィルターが使用されていることを示します。

  • プローブの対象列。フィルター処理されたデータは、ここを起点としてツリーを通過します。

  • ビットマップ プローブが行内で実行されるかどうか。行内最適化が使用される場合、ビットマップ プローブが IN ROW パラメーターで呼び出されます。それ以外の場合、このパラメーターは省略されます。

次の例は、最適化されたビットマップ フィルターが実行プランでどのように使用されているかを示しています。単一の整数型列で主キー対外部キーの結合を使用し、DimProduct と DimCustomer という 2 つのディメンション テーブルを、ファクト テーブル 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;

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;

次の図は、ディメンション テーブルのスキャン後、最適化されたビットマップ フィルターが両方のディメンション テーブルの操作サブツリー内に作成され、条件に該当しない行をファクト テーブルから排除するための情報が把握されていることを示しています。その後、ファクト テーブルには、できる限り早い段階 (Table Scan 操作) でフィルターが適用されます。フィルターの適用は、Table Scan のプロパティの Predicate セクションに表示されます。Predicate セクションに表示された情報は、ファクト テーブルから返される行を制限するために、最適化されたビットマップ フィルター Opt_Bitmap1008 および Opt_Bitmap1009 が使用されていることを示しています。ファクト テーブル内のプローブの対象列は、[F].[CustomerKey] および [F].[ProductKey] として表示されています。IN ROW パラメーターが表示されていることから、このプロセスには行内最適化が使用されていることがわかります。行内最適化が不可能であった場合、ビットマップ フィルターは Parallelism 操作に適用されます。

ビットマップ フィルターを使用する SQL Server クエリ プラン。

この図からは、次の結論を得ることができます。

  • 最適化されたビットマップ フィルターが 2 つのサブツリーに作成されている。

  • 単一の操作 (Table Scan) に対して両方のフィルターが動的に適用される。

  • 最も選択度が高いと推定される最適化されたビットマップ フィルターが最初に実装されている。

  • ファクト テーブルとディメンション テーブルとの結合に使用される列では、行内最適化を使用可能。つまり、結合は単一の整数列に基づいて行われる。

  • フィルターがクエリのできるだけ早い段階で適用されているため、ツリーの Table Scan 操作からそれ以外の操作へ渡される行数が減っている。