私はいくつかのクエリの最適化に取り組んでおり、説明する方法がわかりません。次のコードでSQL Server 2012の使用: TSQL:静的変数とwhere句の計算
DECLARE @startdate DATETIME2 = DATEADD(day,-1,GETDATE()),
@enddate DATETIME2 = GETDATE()
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN DATEADD(day,-1,GETDATE()) AND GETDATE()
AND somestate = 'NV'
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN @startdate AND @enddate
AND somestate = 'NV'
は、実際の実行計画を見ると、第1の選択は、インデックスが求め有し、第2クラスタード・インデックス・スキャンを持っているキーのルックアップ、。
SELECT
は機能的な目的と本質的に同じなので、なぜ実行計画に違いがあるのかわかりませんでした。私の最後のDBAは、
WHERE
節で値を持つ変数を宣言するのが
WHERE
節の計算よりも優れていると言いましたが、これはそのステートメントに反すると思われます。私は2つのステートメントの間に大きな格差を引き起こす原因を明確にすることを望んでいます。私はこれについてのいくつかの答えを検索しようとしましたが、多くの運がなかった、誰かが正しい方向に私を指すことができれば、私は非常に感謝するだろう。
ありがとうございました!
[NOLOCKをどこにでもぶつける習慣が悪い](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - これはどこにでも使うことをお勧めしません。反対! –
2番目のケースでは、SQL Serverはstartdateとenddateが関連していることを認識していないと思うので、彼は任意の値を期待しているので、スキャンを選択します。 –