私のプロジェクトは巨大なデータベースを扱う必要があります。最悪の場合、8000万行以上になることもあります。
今、私は2つのテーブルT1
とT2
. テーブルからテーブルにデータをコピーする必要がありT1
ますT2
- テーブル内の行がテーブル内に
T1
既に存在する場合T2
(同じ主キー)、行の他の列のデータを次のように更新しますT1
。T2
- そうでなければ、新しい行を挿入します
T2
最初に、while ループを使用して 8000 万行をループし、T1
次に更新または挿入しT2
ます。これは非常に非常に遅く、完了するまでに 10 時間以上かかります。ただし、いずれかの行でエラーが発生した場合は、それを無視してエラーをキャッチすることもできます。
その後、次のようなクエリを使用します。
update Table2
set T2.Column1 = T1.Column1,T2.Column2=T1.Column2
from Table2 T2 JOIN Table1 T1 ON T1.ID=T2.ID
これははるかに高速で、完了するまでに約 1 時間から 2 時間しかかかりません。ただし、いずれかの行にエラーがある場合、クエリはまったく実行できません。
だから、私の質問は:
上記のクエリがエラー行を無視し、有効な行で実行を継続できる方法はありますか?
それができない場合、最初の方法よりも速く実行し、エラー行をキャッチするにはどうすればよいですか?
p/s: テーブルを複数の小さな部分に分割してから、すべての小さな部分を同時に更新または挿入しようとしましたが、まったく速くなりませんでした。
2番目の方法で問題を解決しました。行を挿入または更新するときの例外を防ぐために TRY_CAST を使用します。無効なデータはすべて NULL になります。終了後、2 つのテーブルを比較し、異なる行を見つけます。これらの行はエラー行です。