2012-03-27 8 views
1

SQL Server 2000データベースのテーブル(テーブル1)に多数の変更をポストするアプリケーションがあります。次に、テーブルの一意のキーを含む一括更新.Netアプリケーションを使用したSQL Server 2008データベースの更新 - 最も実績のあるメソッド

各挿入/更新/火災をそのテーブル上のトリガを削除し、別のテーブル(表2)に変更の詳細をポスト、1

は、特定の間隔で。ネットアプリケーションは、テーブル2をポーリングして、SQL Server 2008データベース - テーブル3のテーブル1と同一のテーブルに転送する必要のある更新があるかどうかを確認します。 ルーチンは変更の「上位10000」行を取り出して適用します個別にテーブル3に移動し、残りがなくなるまでプロセスを繰り返す。各10,000は、データの転送が完了したことを示す表2の一括更新を含む、処理に約1分かかる。

テーブル3の各更新は一意のキーを使用して実行され、テーブルのインデックスは健全です。

テーブル3の更新が完了すると、テーブル2が更新され、トランザクションがSQL Server 2008データベースに適用されたことが示されます。

表1は40,000回の更新でヒットすることがありますが、これらはうまくいくようですが、レコードが更新されるとSQl Server 2008データベースが壊れます。

テーブル3に更新を投稿する最も効果的な方法は何ですか?

私はサービスブローカーが仕事をするかもしれませんが、.NetアプリケーションでXMLメッセージを作成し、それをサービスブローカーのキューに入れて適用する方法 - とにかく同じ問題を引き起こさない - 別のプロセスによって実行された同じジョブ。

+0

SQLジョブでレプリケーションを検討したことがありますか? –

+0

Paul、私はT-SQLを使ってこの仕事を始めたのは初めてのときでした。私はSQL 2000とSQL 2008の両方のデータベースを使用していたので、仕事を受け入れられるものは何も見つからなかった。私はオープンクエリーについて考えましたが、それはどちらかの仕事をしていないようでした。あなたが知っていることを知っているなら、私はすべての耳です! –

+0

あなたはおそらく私が提案できるすべてを試したことがありますが、時にはSQLの答えが開発者には必ずしも分かりません。可能であれば、私はサーバーをリンクし、SQL 2008サーバーのすべての重大な作業をやろうとしましたが、もう一度、おそらくそれを過度に単純化しています。 –

答えて

0

サービスブローカーを使用しても、魔法のように作業負荷を速くすることはありません。なぜそれを期待していますか?

大量のDMLを実行する最も効率的な方法は、通常、問合せごとに大​​きなバッチで実行することです。これにより、オプティマイザは、受信する行の正確な量についてクエリ計画をチューニングできます。各更新を単一の問合せとして実行すると、オプティマイザは問合せ全体を最適化できません。

したがって、すべての更新を1つのマージステートメントに収めることをお勧めします。また、この単一のマージクエリに挿入と削除を含めます。

+0

usr - 申し訳ありませんが、もし私が明確でなければ、サービスブローカーが魔法のように問題を解決するとは思わないので、私のコメント "...サービスブローカーが適用されます - とにかく同じ問題を起こさないでしょう別のプロセスで外に出す」私は単一のマージクエリについてのあなたのコメントが好きです。しかし、 "単一マージクエリー"は私にとっては新しい言い回しです。あなたはマージステートメント(私は前にそれを使用したことはありません)または何か他のものを意味しますか? –

+0

はい、マージステートメントです。最大3つのDMLサブクラメントを持つことができます。 1つは挿入用、1つは更新用、もう1つは削除用です。 – usr

関連する問題