次の方法で共有


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

ビットマップ フィルタが使用されている並列クエリの実行プランでは、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 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;

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

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

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

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

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

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

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

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