多数

2016-10-28 3 views
0

私は下に次の更新ステートメントを持っている:多数

UPDATE [dbo].[mytable] 
SET [originaldate] = 
CASE 
    WHEN [datecolumn1] <= [datecolumn2] THEN datecolumn3 
    ELSE [datecolumn1] 
END 

行の260万のために、ほぼ5分間実行この文。このクエリを最適化する方法はありますか?

CONVERT(date, [datecolumn2])のような列をdatetimeのように変換しようとしましたが、実行時間は同じですが、このような列をdateに変換しようとしました。

また、必要な列とIDをテンポラリテーブルに入れてみましたが、まだパフォーマンスが悪いです。

答えて

0

ログとトランザクションのオーバーヘッドのために、テーブル内のすべての行を更新するには時間がかかります。これはより速く見つけることができます:

select t.* 
into #temp 
from mytable; 

truncate table mytable; 

insert into mytable(col1, . . ., originaldate) 
    select . . ., 
      (CASE WHEN [datecolumn1] <= [datecolumn2] THEN datecolumn3 
       ELSE [datecolumn1] 
      END) 
    from #temp; 
+0

多分あなたはこれを使用することができないいくつかの状況を述べることができます、例えば、それはキーの制約を持っている、または自動増分フィールド(IDをオフにする必要があります)、ありがとう。 – Prisoner

+0

私はこれを試すことができますが、私の懸念は制約とアイデンティティです。また、私のテーブルにはたくさんの列があります。 @GeraldGonzales。 –

+0

。 。アイデンティティは 'identity_insert'で手を加える必要があります。制約はその性質に依存します。 –

2

なぜ時間がかかっても問題になりますか?これは、あなたが定期的にやるべきことのようではありません。

ことがあるなら、あなたはcomputed column

、あるいはアプリケーション・ロジック、ビューまたは状況に応じてSELECT文での使用を検討すべきです。

+0

計算列の小さな例は、あなたの答えの中で素晴らしいでしょう。リンクだけへの参照は本当の良い答えではありません(私はそれが何らかの形式の回答を構成することは認めますが)。この視点の詳細は​​こちら[こちら](http://meta.stackexchange.com/q/8231/273645)をご覧ください。 –