2012-03-20 6 views
0

私は周りを見回しましたが、これに対する答えを見つけることができないようですが、私がそれを見落としてしまった場合、私にそれをまっすぐに指摘してください。SQL - 更新はテーブル上でどのような順序で行われますか?

テーブルを更新するクエリがあります。更新は、表の順序に依存します。

SQLの更新ステートメントは、行単位でテーブルをまっすぐに処理しますか? Updateステートメントは、テーブルから直接、または最初に実行されたテーブルの「キャッシュされた選択」から、各行を参照します。テーブルの下にカスケードするデータがあり、正しく動作するかどうかはわかりません。

この更新プログラムを実行するには、Update - Fromステートメントを使用します。このステートメントでは、テーブルが別のテーブルに結合されてから元のテーブルに戻されます。 order byステートメントは、更新が行われる前にデータを注文するのか、それとも何か他のことをしますか?

私はSQL Server 2008 r2を使用しています。

更新:これは私がhereに質問した別の質問との関係です。

Id1 Id2 
----------- 
100 50 
120 70 
70  50 
34  20 
50  40 
40  10 

以上が効果的に上記の減少である以下のデータに更新し、更新を行いますので、全体的に、Id1のから、Id2との情報を更新する必要があります: 更新は次のようになり、そのデータ上で動作します:

Id1 Id2 
----------- 
100 10 
120 10 
34  20 

私はそれを見て、それがDESCで上から下に動作するかどうか、ちょっと、更新が注文誰に起こると通じて頂きますようにこれをやって心配する必要はありません」、想定していました。しかし明らかにそれは正しくありません。

+2

をあなたは思い出させた後、「*テーブルの順序が*」 –

+0

確かに、私は(それを知っていますかようなものはありません私!)、私は何を頼んでいると思う私は更新プログラムのために何らかの種類の順序を保証することができますか? –

+0

SQL Management Studioで実行計画を使用して、クエリの実行方法と順序を確認できませんか。 –

答えて

1

あなたが特定の順序で更新する必要がある場合は、カーソルを使用します。

declare myCursor cursor 
for select * from myTable1 t1 
inner join myTable2 t2 on t1.id = t2.fid 
order by t1.id /* <==== */ 
for update of t1.col1, t1.col2 

open myCursor 
fetch next from myCursor /* optional into clause */ 
while @@fetch_status = 0 
begin 
    update myCursor set col1 = /* Some expression */, col2 = /* Some expression */ 
    fetch next from myCursor /* optional into clause */ 
end 
close myCursor 
deallocate myCursor 
+0

スケーリング時にパフォーマンスに大きな影響を与えますか?私は3milの行をよく見ています。いいサーバーでいいですね。 –

関連する問題