1

100 万を超えるレコード (製品) を含むテーブルがあります。現在、毎日、既存のレコードを更新するか、新しいレコードを追加する必要があります。

1 つずつ行う (数時間かかる) 代わりに、SqlBulkCopy大量のレコードを処理し、数秒で挿入を行うことができましたが、新しい挿入しか処理できません。そこで、新しいレコードと古いレコードを含む新しいテーブルを作成することを考えています。次に、その一時テーブルを (SQL 側で) 使用して、メイン テーブルを更新/追加します。

その更新を実行するにはどうすればよいですか?

4

2 に答える 2

0

これを処理するより良い方法の 1 つは、SQL のMERGEコマンドを使用することです。Mssqltips には優れたチュートリアルがあり、他のコマンドよりも少し使いにくい場合があります。

また、ロックが原因で、更新中のブロックを許容できることがわかっている場合を除き、これを複数の小さなトランザクションに分割することをお勧めします。

于 2012-12-10T17:43:24.293 に答える
0

あなたが説明した方法で、コードでこの状況を処理します。一時テーブルがあり、一時テーブルの ID が更新対象のテーブルと一致する更新を実行し、更新対象のテーブルの ID が null の場合に挿入を実行します。ただし、これは通常、ライブラリ/プログラム設定の更新のために行うため、小さなテーブルではまれにしか実行されません。多くのレコードや毎日の実行では、パフォーマンスが標準に達しない場合があります。

この方法で私が遭遇した主な「落とし穴」は、更新のために、実際に更新を実行する前に、いくつかのフィールドの少なくとも 1 つが変更されていることを確認するために比較を行ったことです。(これの最初の理由は、サーバーの動作に影響を与える可能性のあるいくつかのデフォルトを上書きしないようにすることでした。一時テーブルに実際に変更されていないレコードが含まれている可能性がある場合、これの理由はパフォーマンスかもしれません)。実際にデフォルトの 1 つを更新したい場合がありましたが、古いスクリプトではそれがキャッチされませんでした。したがって、更新する製品を決定するために比較を行う場合は、最初から完全であることを確認するか、比較しないフィールドとその理由を十分に文書化してください。

于 2012-12-10T17:36:07.810 に答える