2012-04-12 7 views
1

私は何百万(8500万)の行を含むテーブルで2つのカラムを更新しています。これらを更新するには、数百万行のテーブルを含む2つのカラムを更新する

UPDATE Table1 

    SET Table1.column1 = Table2.column1 , 
     Table1.column2 = Table2.column2 

FROM 
     Tables and with a Join-conditions; 

のような更新コマンドを使用しています。私の問題は23時間かかることです。バッチサイズを使用した後でさえ、取られた時間に大きな変化はありません。

ただし、5時間以内に更新する必要があります。それは可能ですか?私はそれを達成するためにどのようなアプローチを取るべきですか?

+0

**全体**テーブルを更新する必要がありますか?私が考えることのできる唯一のことは、テーブル間のJOINで使用される列がインデックスされていることを確認することです。 –

+0

クエリプランを調べる必要があります。おそらくあなたを助けるかもしれないいくつかの指標があります。 –

+0

@Amarnathすぐにテーブルを分割することを検討していることを願っています。 – McGarnagle

答えて

0

私はこの作業を行うためにSSISを使用しました。

最初に2列を更新する必要があるソーステーブルを取得しました。次に、ソーステーブルの列を、ソーステーブルの列を更新するためのデータを取得する必要がある宛先テーブルの列にマップする必要のあるルックアップタスクを実行しました。最後に、ルックアップから参加条件に基づいてテーブルを埋める場所からOLEDBの宛先を追加しました。

このプロセスは、更新スクリプトを実行するよりも高速でした。

3

SQL Updateステートメントは、失敗時にロールバックできるように、ログファイル内のすべての行を保持する必要があります。 this guyで説明したように、数百万行を処理するための最良の方法は、50,000行(または何でも)にアトミックとバッチあなたの更新を忘れることです。

--Declare variable for row count 
Declare @rc int 
Set @rc=50000 

While @rc=50000 
Begin 

    Begin Transaction 

    --Use Top (50000) to limit number of updates 
    --performed in each batch to 50K rows. 
    --Use tablockx and holdlock to obtain and hold 
    --an immediate exclusive table lock. This unusually 
    --speeds the update because only one lock is needed. 
    Update Top (50000) MyTable With (tablockx, holdlock) 
    Set UpdFlag = 0 
    From MyTable mt 
    Join ControlTable ct 
    On mt.KeyCol=ct.PK 
    --Add criteria to avoid updating rows that 
    --were updated in previous pass 
    Where m.UpdFlag <> 0 

    --Get number of rows updated 
    --Process will continue until less than 50000 
    Select @[email protected]@rowcount 

    --Commit the transaction 
    Commit 
End 

これはまだあなたがどの行を知っている必要があり、その中にいくつかの問題を持っていますあなたはすでに処理しています。おそらく、この男よりもスマートな人(そして私!)は、MSSQLの魔法のほうがいいと思うかもしれません。しかしこれはスタートになるはずです。

+0

[MSDN](http://msdn.microsoft.com/en-us/library/ms188774%28v=sql.90%29.aspx)によれば、代わりに 'update top(50000)'を使うべきです。 "SET ROWCOUNTを使用しても、SQL Serverの次のリリースではDELETE、INSERTおよびUPDATEステートメントには影響しません。 –

+0

@Simon Buchanありがとう。私はこれを試し、すぐにアップデートを投稿します。 – Amarnath

+0

@Simon Buchan私はこの作業を行うために "ルックアップ"を使用しましたが、成功した結果が得られました。 – Amarnath

関連する問題