1

250 万行を含むテーブルがあり、各行には xml 型の列が 1 つあります。メッセージが別のキュー (トリガーキュー) に到着したときに、すべてのレコードを削除して sqlserver サービス ブローカー キューに入れる必要があります。パフォーマンスは非常に重要ですが、今では遅すぎます。これを達成するための最良の方法は何ですか?

現在、while(@message <> null) ループで実行するトリガーキューでアクティブ化された sp を使用します。

begin transaction
delete top (1) from table output @tempTable
select top 1 @message = message from @tempTable
send on conversation @message
commit transaction

この問題に取り組むためのより速い方法はありますか?

ところで: 誰かが尋ねる前に: テーブルから始める必要があります。これは、以前に計算されたマージ ステートメントからの出力で満たされているためです。

4

1 に答える 1

0

つまり、パフォーマンスの問題は受信側ではなく送信側にありますよね? (あなたの質問からは少し不明確です)。この場合、次のことを試すことから始めます。

  1. 1 つのトランザクションで多くの操作をバッチ処理します。コミット時に同期ログ フラッシュが最も多く発生する可能性があります。
  2. テーブルをより効率的に処理してみてください (たとえば、一度に複数の行を一時テーブルに選択してから、カーソルを使用してそれを反復処理し、メッセージを送信します)。

受信側で問題が発生している場合は、Remus によるこの素晴らしい記事をご覧ください。

于 2010-11-25T21:29:11.360 に答える