web-dev-qa-db-ja.com

@dateとgetdate()のパフォーマンスに違いはありますか?

通常、where句でgetdate()関数を使用して、時間を遡ります。何かのようなもの:

 DOC.DATUM >= DATEADD(DD,-1*SSN_SDO.DANA_ZA_POVRAT,GETDATE()) 

SQL Server 2008R2は、最初に日付パラメーターを宣言し、代わりにそれをクエリで使用した場合、より高速なクエリを実行しますか?

declare @dateNow date = getdate()
...
where
     DOC.DATUM >= DATEADD(DD,-1*SSN_SDO.DANA_ZA_POVRAT,@dateNow ) 
6
adopilot

答えは-あなたはそれを見つけるためにそれをテストする必要があるということです。
8,000,000行までのテーブルで自分のテストを行いました

DECLARE @date DATETIME
SET @date = GETDATE()
;
SELECT T.DateCol, DATEADD(dd,-100,@date)
FROM dbo.TableName AS T
WHERE T.DateCol > DATEADD(dd,-100,@date)
;
SELECT T.DateCol, DATEADD(dd,-100,GETDATE())
FROM dbo.TableName AS T
WHERE T.DateCol > DATEADD(dd,-100,GETDATE())
;

私の場合、変数を使用すると、SQL Serverは高額なプランを推定しました。

enter image description here
理由は、SQL Serverがコンパイル中にクエリプランを構築するためです。
その時点では、変数の値はまだ不明であり、SQL Serverは統計を使用できません。
パラメータ化 について読むことをお勧めします

変数を使用すると、関数を何度も呼び出すよりもコストが安くなる他の場合があります。
再びここにあります-テストテスト、およびテスト:)

5
Roi Gavish

最も重要なのは、それを変数に入れる必要がある主な理由は、コードのどこかでまったく同じ値(その時刻のGETDATE())を使用したい場合です。そうでなければ、それのパフォーマンスの違いは本当に問題のあるポイントです。

0
dng