いくつかのテストテーブルでは、私の最後の元の計画は次のようになります。
結果を1回計算し、それをsppolにキャッシュしてから、その結果を再生します。次のことを試して、SQL Serverがサブクエリを相関していると見なし、外側の行ごとに再評価する必要があると見なすことができます。
UPDATE table1
SET table2Id = (SELECT TOP 1 table2Id
FROM table2
ORDER BY Newid(),
table1.table1Id)
私にとって、スプールなしでこの計画を立てます。
table1
の一意のフィールドで相互に関連付けることが重要です ただし、スプールが追加された場合でも、相関値は行ごとに異なるため、スプールを巻き戻す(最後の結果を再生する)のではなく、常にリバウンドする必要があります。
テーブルが大きい場合、必要な作業は2つのテーブルの行の積であるため(table1
の各行に対して)、これは遅くなります。 table2
のフルスキャンを実行する必要があります )