1

私のプロジェクトは巨大なデータベースを扱う必要があります。最悪の場合、8000万行以上になることもあります。

今、私は2つのテーブルT1T2. テーブルからテーブルにデータをコピーする必要がありT1ますT2

  • テーブル内の行がテーブル内にT1既に存在する場合T2(同じ主キー)、行の他の列のデータを次のように更新しますT1T2
  • そうでなければ、新しい行を挿入します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 つのテーブルを比較し、異なる行を見つけます。これらの行はエラー行です。

4

3 に答える 3

0

2番目の方法で問題を解決しました。行を挿入または更新するときの例外を防ぐために TRY_CAST を使用します。無効なデータはすべて NULL になります。終了後、2 つのテーブルを比較し、異なる行を見つけます。これらの行はエラー行です。

于 2013-06-20T10:45:20.483 に答える