getdate()
ランタイムです定数関数
関数参照ごとに 1 回だけ評価されるため、
SELECT GETDATE()FROM SomeBigTable
プレ>クエリの実行にかかる時間に関係なく、すべての行に対して同じ結果が返されます。
ただし、両者には違いがあります。最初のものは変数を使用し、変数が SQL Server に割り当てられる前にプランがコンパイルされるため、(再コンパイルがない場合) 行の 30% が返されると想定されます。この推測により、2 番目のクエリとは異なるプランが使用される可能性があります。
GETDATE()
を使用する際の注意事項 フィルターで直接GETDATE()
を評価することです コンパイル時以降、クエリまたはデータを変更して再コンパイルをトリガーすることなく、選択性が劇的に変化する可能性があります。以下の例では、1,000 行のテーブルに対する変数を使用したクエリにより、推定 300 行と完全なテーブル スキャンの計画が導かれますが、関数呼び出しが埋め込まれたクエリでは、1 行が推定され、ブックマーク ルックアップが実行されます。これは最初の実行では正確ですが、時間の経過により 2 回目の実行ではすべての行が適格になり、1,000 回のランダムなルックアップを実行することになります。USE tempdb;CREATE TABLE [myTable](CreatedDate datetime,Filler char(8000) NULL)CREATE NONCLUSTERED INDEX ix ON [myTable](CreatedDate)INSERT INTO [myTable](CreatedDate)/*1 行挿入最初に適合する*/SELECT DATEADD(D,-2001,getdate())UNION ALL/*最初に適合しない999行*/SELECT TOP 999 DATEADD(minute,1, DATEADD(D,-2000,getdate() ))FROM master..spt_valuesEXEC('DECLARE @myDate DATETIME =DATEADD(D,-2000,getdate())SELECT * FROM [myTable] WHERE CreatedDate <=@myDate')EXEC('SELECT * FROM [myTable] WHERE CreatedDate <=DATEADD(D,-2000,getdate())')RAISERROR ('Delay',0,1) WITH NOWAITWAITFOR DELAY '00:01:01'EXEC('DECLARE @myDate DATETIME =DATEADD(D,-2000, getdate())SELECT * FROM [myTable] WHERE CreatedDate <=@myDate')EXEC('SELECT * FROM [myTable] WHERE CreatedDate <=DATEADD(D,-2000,getdate())')DROP TABLE [myTable]コード> プレ>