私は自分で見つけることができなかったので、(私はそれを検索する方法がわからないため)何かの説明が必要です。SQLクエリ変数とハードコードされた値の比較
いくつかのCommon Table Expressionsを持つSQL Serverクエリがあります。これらのCTEの1つは、日付とユーザーがnullでないことに基づいてデータを選択しています。
WHERE
"dummy"."UsageEnd" >= '20161001'
AND "dummy"."UsageEnd" < '20161101'
AND "Users"."Login" IS NOT NULL
この形式では、このクエリは約2秒で実行されますが、このクエリは非常に一般的に実行されるため、パラメータに変更する必要があります。しかし、私はそれを変更した場合:リマインダーとして(
declare @datestart datetime
set @datestart = '20161001';
declare @dateend datetime
set @dateend = '20161101';
このサブクエリは、23〜24秒で実行し、全体の問合せこのサブクエリを:@start
と@end
はどちらかdatetime
またはvarchar
として宣言されている
WHERE
"dummy"."UsageEnd" >= @start
AND "dummy"."UsageEnd" < @end
AND "Users"."Login" IS NOT NULL
以前は12〜15秒かかっていたときに7〜8分かかります)。
日付を変数と比較すると実行時間が非常に劇的に向上する理由を誰かに説明できますか?また、CTEが変数である場合には、1つではなく毎回それを再評価するため、クエリ全体が長時間かかる可能性もあります。
実行計画を比較しましたか? – jarlh
おそらくパラメータスニッフィングと関係があります。あなたがそれを検索するなら、私が与えることができるよりも優れた説明と解決策を見つけるでしょう。あなたは 'RECOMPILE'ヒントを試してみることもできます。 – HoneyBadger
**固定値**を日付リテラルとして指定すると、SQL Serverはこの正確な日付値**のクエリを最適化できます。 **パラメータ**を指定した場合、SQL Serverは可能な限り最適な実行計画**をパラメータ値として提供する可能性のある日付値**に対応させる必要があります。別の実行計画 –