現象
Microsoft SQL Server のクエリ実行プランによっては、テーブルやインデックスのスキャンまたは範囲操作の前に、フィルターの評価パターンが含まれているものがあります。たとえば、フィルター述語の一部がインデックス キーと一致している場合、インデックス シークや範囲スキャンの実行に使用されることがあります。述語の残りの部分を "残余" といい、スキャンまたは範囲操作で出力されるあらゆる行で評価される必要があります。これは、フィルター演算子に対応します。なお、SQL Server では、パフォーマンスを向上するために、これらのフィルターをテーブル アクセスの演算子自体にプッシュダウンすることもできます。
この処理によって全体的なパフォーマンスが向上しますが、状況によっては (パラメーター感度に関連する基数推定が不正確な場合など)、述語で指定されたスキャン フィルターで処理している行数が想定よりも多くなる場合があります。このことは、実際の実行プランを使ってクエリのパフォーマンスのトラブルシューティングを行うときに、表面に出ない可能性があります。というのも、返される行数は、残余述語が適用された後の行数であり、テーブルやインデックスからスキャンされた実際の行数ではないからです。
解決方法
上の「現象」で説明した診断機能改善のために、SQL Server 2012 Service Pack 3 (SP3) と SQL Server 2014 SP2 に、XML プラン表示の Actual Rows Read という新しい属性が導入されています。この属性は、残余述語が適用される前に、演算子によって実際に読み取られた行数を示します。
この機能は、SQL Server の次の Service Packs で最初に導入されました。
SQL Server 2012 Service Pack 3 (SP3) の詳細については、bugs that are fixed in SQL Server 2012 Service Pack 3 (英語情報) を参照してください。
SQL Server 2014 Service Pack 2 のリリース情報
SQL Server 2016 Service Pack 1 (SP1)
SQL Server の Service Pack について
Service Pack は累積的であり、最新の Service Pack には新しい修正プログラムと共に、それ以前の Service Pack に含まれていたすべての修正プログラムが含まれています。最新の Service Pack を適用してから、その Service Pack の累積的な更新プログラムを適用することをお勧めします。最新の Service Pack をインストールする前に、以前の Service Pack をインストールする必要はありません。最新の Service Pack と最新の累積的な更新プログラムの詳細については、次のサポート技術情報の記事の表 1 を参照してください。
SQL Server とそのコンポーネントのバージョンとエディションを確認する方法
状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。