概要
新しい EstimateRowsWithoutRowGoal クエリ実行プラン属性を SQL Server 2017 累積更新プログラム 3 (CU3) および Microsoft SQL Server 2016 Service Pack 2 (SP2) に追加します。
クエリ オプティマイザがクエリ実行プランのコストを見積もるとき、通常は、すべてのソースからの適格な行をすべて処理する必要があることを前提としています。 ただし、一部のクエリでは、より少数の行をより速く返すプランがクエリ オプティマイザで検索されます。 これは、クエリで TOP 句、 FAST number_rows クエリ ヒント、 IN 句または EXISTS 句、または SET ROWCOUNT { number | @number\_var } ステートメントが使用されている場合に発生する可能性があります。 この場合、オプティマイザはクエリ プランを見積もるときに行目標を使用しています。 行目標プランが適用されると、クエリ実行プランの予測行数が減少します。 これは、行の目標に到達するために処理する必要がある行の数が少ないとプランが想定しているためです。
注釈 行目標を使用して行われる見積もりは概算です。 実際のデータ分布が均一でない場合は、処理する必要がある実際の行数よりも少ない可能性があります。 そのため、非効率的なクエリ プランが作成される可能性があります。 この問題の回避策として、 USE HINT ('DISABLE_OPTIMIZER_ROWGOAL') クエリ オプションまたはトレース フラグ 4138 を使用できます。
詳細については、「SQL Server 2016 で USE HINT クエリ ヒント引数が導入される更新プログラム」を参照してください。 ただし、行目標が適用されているかどうか、およびそれがプランの選択にどの程度影響するかを、複雑なクエリで識別するのは難しい場合があります。
EstimateRowsWithoutRowGoal 属性を使用すると、結果を EstimateRows 属性の結果と比較して、行目標がクエリ オプティマイザーの見積もりにどの程度影響するかを確認できます。
注釈 行目標が特定のクエリ プラン演算子に適用されていない場合、この属性は含まれません。
追加情報
この更新プログラムは、次の SQL Server の累積的な更新プログラムに含まれています。
SQL Server 2017 の累積的な更新プログラム 3
SQL Server の累積的な更新プログラムについて:
SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。
SQL Server 2017 の最新の累積的な更新プログラム
SQL Server の Service Pack の情報
この更新プログラムは、以下の SQL Server 用 Service Pack で導入されます。
Service Pack 2 (SQL Server 2016)
Service Pack 3 for SQL Server 2014
SQL Server の Service Pack について:
Service Pack は累積的であり、 最新の Service Pack には新しい修正プログラムと共に、それ以前の Service Pack に含まれていたすべての修正プログラムが含まれています。 マイクロソフトでは、最新の Service Pack と、その Service Pack 用の最新の累積的な更新プログラムを適用することをお勧めします。 最新の Service Pack をインストールする前に、以前の Service Pack をインストールする必要はありません。 最新の Service Pack と最新の累積的な更新プログラムの詳細については、次の資料の表 1 を参照してください。
SQL Server とそのコンポーネントのバージョン、エディション、および更新プログラムのレベルを確認する方法
参考資料
マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。