追加するという奇妙な状況に遭遇しました OPTION (RECOMPILE)
クエリすると0.5秒で実行さしましたが、省略するとクエリに5分以上かかります。
これは、クエリがQuery AnalyzerまたはC#プログラムからを介して実行される場合SqlCommand.ExecuteReader()
です。呼び出す(または呼び出さない)DBCC FREEPROCCACHE
またはDBCC dropcleanbuffers
違いはありません。クエリ結果は常に瞬時に返されOPTION (RECOMPILE)
、それがない場合は5分を超えます。クエリは常に[このテストのために]同じパラメータで呼び出されます。
SQL Server 2008を使用しています。
私はSQLの記述にはかなり慣れていますがOPTION
、以前にクエリでコマンドを使用したことがなく、このフォーラムの投稿をスキャンするまではプランキャッシュの概念全体に精通していませんでした。投稿から私の理解は、それOPTION (RECOMPILE)
は高価な操作です。それは明らかにクエリの新しいルックアップ戦略を作成します。それでは、なぜそれを省略した後続のクエリOPTION (RECOMPILE)
が非常に遅いのですか?後続のクエリは、再コンパイルのヒントを含む以前の呼び出しで計算されたルックアップ戦略を利用するべきではありませんか?
呼び出しごとに再コンパイルのヒントを必要とするクエリがあるのは非常に珍しいことですか?
エントリーレベルの質問で申し訳ありませんが、私は本当にこれの表裏を作ることができません。
更新:クエリの投稿を求められました...
select acctNo,min(date) earliestDate
from(
select acctNo,tradeDate as date
from datafeed_trans
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_money
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_jnl
where feedid=@feedID and feedDate=@feedDate
)t1
group by t1.acctNo
OPTION(RECOMPILE)
クエリアナライザーからテストを実行するとき、次の行を付加します。
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
C#プログラムから呼び出す場合、パラメーターはSqlCommand.Parameters
プロパティを介して渡されます。
この議論の目的のために、パラメーターが決して変わらないと仮定することができるので、次善のパラメーターの臭いを原因として除外することができます。
X = @X OR @X IS NULL
にX=@X
と求めて行ってここを参照してくださいまたはウィンドウ関数を持つビューに対してさらに下述部のプッシュ
RECOMPILE
。いずれにしても、実行計画をキャプチャして、違いを確認してください。