2016-09-15 11 views
1

SQLの更新ステートメントのパフォーマンスに関する簡単な質問です。 テーブルに100万行あると仮定し、それらの半分の日付列を更新したいとします。SQL Updateのパフォーマンス

は、機能Date.dbo.fn_GetAlwaysUTCDate()は500K回呼び出されます私の更新は上記のクエリで

UPDATE Table SET DATE = Date.dbo.fn_GetAlwaysUTCDate() WHERE (HALF THE ROWS) 

されますか? WHEREであれば、コンパイラ/オプティマイザの目では決定的な関数ではないので、各行で呼び出されることは分かっています。

+0

UDFは事前評価されていません(折りたたまれている)ので、外部行セットのすべての行に対して実行する必要があります。その動作を一度呼び出すと、その戻り値を変数に格納します。 –

+0

それは私がやっていることです、私はちょうどそれが価値があることを100%確信していませんでした! –

答えて

0

明らかに変数に日時を格納することは、常に高速になります:実行計画を考える:

クエリの場合:

update colname set dt = dbo.fn_getutcdate() 

declare @dt datetime = dbo.fn_getutcdate() 

update colname set dt = @dt 

enter image description here

本家の割合は賢明なことはあまりないですそれぞれのレコードの計算スカラーは別々に実行されますが、これはコストのかかる操作であり、その値をテーブルプールに保持してからそれを維持します彼女の更新

2

これを試してください。この方法では、関数呼び出しは1回だけです。

Declare @dt datetime = Date.dbo.fn_GetAlwaysUTCDate() 

UPDATE Table SET DATE = @dt WHERE (HALF THE ROWS) 
+0

これは一般的なケースではどれくらい速くなりますか?私はこれをやっていましたが、それが何らかの性能向上であったかどうかは分かりませんでした –

+0

あなたはそれをプロファイルして自分のマシンでテストしようとしませんか? –

+0

両方のSQLの推定実行計画を比較します。それはあなたに伝える – Hiten004