ビットマップ フィルタの選択度の問題に関するトラブルシューティング

ビットマップ フィルタでは、条件に該当しない行をクエリ プランの初期段階で排除できるため、スター スキーマを使ったデータ ウェアハウス クエリのパフォーマンスを飛躍的に高めることができます。これにより、結合操作を介して渡される行が減り、それに続くすべての演算子でクエリの応答時間が短縮されます。SQL Server 2008 では、ビットマップ フィルタは、最適化後のクエリ プランで導入できるほか、クエリ プランの生成中にクエリ オプティマイザで動的に導入することもできます。フィルタを動的に導入することを最適化されたビットマップ フィルタと呼びます。ビットマップ フィルタの詳細については、「ビットマップ フィルタを使ったデータ ウェアハウスのクエリ パフォーマンスの最適化」を参照してください。

ビットマップ フィルタに固有のパフォーマンスの問題は、非選択的なビットマップ フィルタでのみ発生します。非選択的ビットマップ フィルタでは、クエリの処理で不要なオーバーヘッドが発生するため、パフォーマンスはむしろ低下し、クエリの実行速度が遅くなってしまう場合があります。

非選択的ビットマップ フィルタの診断と解決

非選択的ビットマップ フィルタに関連したクエリ パフォーマンスの問題を診断して解決するには、次の手順に従います。

  1. パフォーマンスの問題を引き起こしているクエリを特定します。

    SQL Server Profiler を使用して、時間のかかるクエリを特定します。詳細については、「SQL Server Profiler の使用」を参照してください。プラン表示を生成することによってクエリのパフォーマンスを分析することもできます。プラン表示は、クエリ オプティマイザが生成するクエリ実行プランのテキスト、XML、またはグラフィカル表示です。詳細については、「SET SHOWPLAN_TEXT (Transact-SQL)」、「XML プラン表示」、および「グラフィカル実行プランの表示 (SQL Server Management Studio)」を参照してください。

  2. クエリにビットマップ フィルタが使用されていることを確認します。

    実際にビットマップ フィルタが使われているかどうかは、sys.dm_exec_query_plan (Transact-SQL) および sys.dm_exec_query_stats (Transact-SQL) を使ってクエリ プランをキャプチャすることで確認できます。クエリの XML プラン表示またはグラフィカル実行プランでビットマップ フィルタを探す方法もあります。詳細については、「ビットマップ フィルタを含んだ実行プランの解釈」を参照してください。

  3. ビットマップ フィルタがパフォーマンスの問題の原因であることを確認します。

    ビットマップ フィルタは、ハッシュ結合またはマージ結合が使用されている並列クエリ プランでのみ適用されます。最適化されたビットマップ フィルタは、ハッシュ結合が使用されている並列クエリ プランでのみ適用されます。ビットマップ フィルタがクエリのパフォーマンスに影響を与えているかどうかを確認するには、クエリ ステートメントに結合ヒント LOOP を指定して、手動でビットマップ フィルタを無効にします。これにより、ハッシュ結合ではなく、指定した結合の種類がオプティマイザによって強制的に選択されます。また、クエリ ステートメントで結合ヒント MERGE を指定することによって、最適化されたビットマップ フィルタを無効にすることもできます。これらのヒントの使用に関する詳細については、「結合ヒント (Transact-SQL)」および「クエリ ヒント (Transact-SQL)」を参照してください。

  4. トレース イベント Bitmap Warning を使用して、ビットマップ フィルタが無効にされているクエリを追跡します。

    既定では、非選択的なビットマップ フィルタがクエリ オプティマイザによって自動的に無効化されます。このトレース イベントが発生した場合は、ビットマップ フィルタが非選択的になった原因を排除してゆきます。ビットマップ フィルタが非選択的になる原因としては、次のようなことが考えられます。

    • クエリ オプティマイザによって行われた基数の推定が不適切である。

      基数の推定には、インデックスまたは統計を作成するときに手動か自動で作成されたヒストグラムが主に使用されます。古い統計情報やインデックスの欠落によって基数が正しく推定されず、コスト計算が不正確になり、最適ではないクエリ プランが生成された可能性があります。クエリで使用している列に有用なインデックスまたは統計を作成します。詳細については、「クエリのパフォーマンスが低下している場合のトラブルシューティング : 基数推定」を参照してください。

    • システムのメモリが不足している。

      メモリ不足で負荷の高いシステムでは、クエリ プランにビットマップ フィルタを使用したクエリが含まれていると、クエリがビットマップの作成に必要な最低限のメモリ量を確保できなかった場合に、ビットマップ操作が削除されることがあります。SQL Server や SQL Server 以外で、システムのメモリ不足を引き起こしている可能性のあるコンポーネントのパフォーマンスを監視するには、システム モニタを使用します。たとえば、Memory Manager オブジェクトを使用すると全体的なサーバー メモリの使用状況を監視できます。詳細については、「リソースの利用状況の監視 (システム モニタ)」を参照してください。メモリ不足の問題のトラブルシューティングについては、「SQL Server 2005 でのパフォーマンス問題のトラブルシューティング」を参照してください。

    • クエリを並列実行できるだけのスレッドがない。

      ビットマップ フィルタは、並列クエリ プランでのみ適用されます。並列処理の特定の次数に応じた並列プランのスレッド要件を満たすことができない場合、データベース エンジンが並列処理の次数を自動的に下げるか、指定されたワークロード コンテキストでの並列プランを完全に破棄します。その後、直列プラン (1 つのスレッド) を実行します。詳細については、「並列処理の次数」を参照してください。