実行プランを最初に見ると、式1/0
がCompute Scalar演算子で定義されていることがわかります。
さて、実行計画を繰り返し呼び出して、左端の実行を開始しないにもかかわらず、Open
およびGetRow
子イテレータのメソッドが結果を返すために、SQL Server 2005およびそれ以降の表現がしばしばだけされていることにより、最適化を含んで定義されて、計算スカラでは、後続まで延期評価操作には結果が必要です。
この場合、式の結果は、クライアントに戻るために行を組み立てるときにのみ必要です(緑色のSELECT
アイコンで発生すると考えることができます)。そのロジックにより、遅延評価は、どちらのプランも戻り行を生成しないため、式が評価されないことを意味します。ポイントを少し労力をかけるために、クラスター化インデックスシークもテーブルスキャンも行を返さないため、クライアントに返すためにアセンブルする行はありません。
ただし、一部の式はランタイム定数として識別され、クエリの実行が開始される前に1回評価されるため、個別の最適化があります。この場合、これが発生したことはshowplan XML(左側のクラスター化インデックスシークプラン、右側のテーブルスキャンプラン)で確認できます。
このブログ投稿では、基礎となるメカニズムと、それらがパフォーマンスにどのように影響するかについて詳しく説明しました。そこで提供される情報を使用して、最初のクエリを変更して、実行が開始される前に両方の式が評価およびキャッシュされるようにすることができます。
select 1/0 * CONVERT(integer, @@DBTS)
from #temp
where id = 1
select 1/0
from #temp2
where id = 1
現在、最初のプランには定数式参照も含まれており、両方のクエリでエラーメッセージが生成されます。最初のクエリのXMLには次が含まれます。
詳細:スカラー、式、およびパフォーマンスの計算