1

次のような2つのテーブルがあります。

-table1: id_1, id_2, id_3, ref_id (id_1, id_2 is pk)
-table2: ref_id, id_4

id_3 フィールドを table2 の id_4 と等しくする必要があります (ref_id は主キーです) table1 には約 600 万のレコードがあり、table2 には約 2700 のレコードがあります。

私は次のようなSQLを書きました:

update table1
set id_3 = b.id_3
from table1 
left join table2 b on id_1= b.ref_id

SQL Server を使用すると、クエリに約 16 時間かかり、応答がありません。クエリ時間を短縮するにはどうすればよいですか?

4

3 に答える 3

0

この質問に答えるには、2 つのテーブルのクラスター化インデックスが何であるかを知る必要があります。この特定のクエリを高速化するためにクラスター化インデックスを提案することはできますが、クラスター化インデックスを選択する際には、他の要因を実際に考慮する必要があります。

それを念頭に置いて、これらのインデックスが役立つかどうかを確認してください。

table1: (id_1, id_2) の UNIQUE CLUSTERED INDEX テーブル 2: (ref_id) の UNIQUE CLUSTERED INDEX

基本的に、PK がまだクラスター化されていない場合はクラスター化します。

もう 1 つの重要な点は、この更新の実行中にテーブルが他のトラフィックを認識しているかどうかです。その場合、実行時間が長いのはブロッキングが原因である可能性があります。この場合、バッチ処理を検討する必要があります。つまり、すべてを 1 つのステートメントで更新するのではなく、一度に小さな部分だけを更新することです。

于 2013-06-23T00:07:05.003 に答える
0

いずれにせよ、600 万行のテーブルのすべての行を更新するのは遅くなる可能性があります。

すべての行を更新する最大速度のベンチマークを取得する 1 つの方法は、クエリの時間を測定することです。

update table1
set id_3 = 100

また、table2 に一致する行がない table1 の行を更新する必要がありますか? その場合、左外部結合を内部結合に切り替えると、パフォーマンスが大幅に向上します。

于 2013-06-22T18:17:52.600 に答える