質問: 私は約30M行のSQL Serverに1日に何個のオプションを挿入するのですか? SqlBulkCopyを使用すると、既に存在するデータを挿入しないように処理しますか? 私のシナリオでは、データを複製せずに同じデータを何度も繰り返して実行する必要があります。 現時点では、私は、更新ステートメントとDataTableからデータを読み取る挿入ステートメントを持つストアドプロシージャを持っています。 より良いパフォーマンスを得るためには何を探していますか?
回答: このようなことをする通常の方法は、制約のない永続的な作業表(または表)を維持することです。多くの場合、これらは同じサーバー上の別々の作業データベースに存在することがあります。 データをロードするには、作業表を空にして、BCP /一括コピーを介してデータをブラストします。データが読み込まれると、新しく読み込まれたデータを準備するために必要なクリーンアップや変換が行われます。これが終わったら、最後のステップとして、古いデータと新しいデータの間にデルタを実装するために必要な更新/削除/挿入操作を実行するか、単に実際のテーブルを切り捨てて再ロードすることによってデータを実際のテーブルに移行します。 もう1つの選択肢として、安定したデータの流れに似たものがある場合は、デーモンを設定してデータの到着を監視し、挿入を行うことがあります。たとえば、データがフラットファイルの場合、FTPなどを介してディレクトリにドロップされますが、デーモンはディレクトリの変更を監視し、スタッフが到着したときに必要な作業を行います(前述のように)。 考慮すべきことは、これが運用システムの場合、大量の挿入/削除/更新文を実行すると、トランザクションが実行中にブロックされる可能性があるということです。また、巨大なトランザクションに失敗し、ロールバックすること自体には欠点があります。 * ロールバックには処理にかなりの時間がかかります。 * ロックはロールバックの間保持されるため、データベースのブロックや他の競合の機会が増えます。 * 最悪の場合、起こった後、あなたは前向きな動きを達成していません。言いたいことです。多くの時間と労力がかかっています。 したがって、状況に応じて、より小さなバッチで挿入/更新/削除を実行して、進歩を確実に達成することをお勧めします。 24時間にわたる3000万行がcであると考えられます。 350 /秒。