4

私はそのようなSQL更新文を持っています

UPDATE t1 SET t1.Field = t2.Field
FROM Table1 as t1
INNER JOIN Table2 as t2 on t1.Key = t2.Key
WHERE t2.FilterField = 'abc'

where 句により、行が更新されないように、ステートメントが 30 分間実行されます。(テーブルには 5000 万行あります)

ステートメントを次のように変更すると、何が奇妙になりますか

SELECT t1.Field, t2.Field
FROM Table1 as t1
INNER JOIN Table2 as t2 on t1.Key = t2.Key
WHERE t2.FilterField = 'abc'

空の結果セットがほぼ瞬時に返されます

ステートメントを次のように変更すると、

UPDATE t1 SET t1.Field = 1
FROM Table1 as t1

約 3 秒でテーブルを更新します。

レコードを更新していない更新ステートメントでSQL Serverが何を詰まらせているのか、私は本当に混乱しています。

4

2 に答える 2

2

最近似たようなことがありましたが、解決策は次のとおりです。

UPDATE t1 SET t1.Field = t2.Field
FROM (SELECT DISTINCT Table1 as t1
INNER JOIN Table2 as t2 on t1.Key = t2.Key
WHERE t2.FilterField = 'abc') t3
WHERE t1.key = t3.key

key は何らかの形式の一意化子です。私たちにとって、問題を引き起こしたのは注文です。したがって、別のオプションはインデックスです。これにより、6 時間かかっていたクエリが約 1 分に短縮されました。

于 2016-11-21T22:17:14.757 に答える
0

タイミングが問題にならない場合は、次のように個別の更新ステートメントを作成して実行し、何が起こるかを確認できます。

SELECT 'UPDATE Table1 SET Field = ' + CAST(t2.Field as varchar(max)) + ' WHERE Key = ' + CAST(t1.[Key] as varchar(max))
FROM Table1 as t1
INNER JOIN Table2 as t2 on t1.[Key] = t2.[Key]
WHERE t2.FilterField = 'abc'
于 2013-04-18T00:06:43.513 に答える