2017-10-03 19 views
1

私は数ヶ月間、自分のデータベースで使用しているService Brokerキューインフラストラクチャを使用しています。 Initiatorキューが2百万レコードに達し、EndDialogメッセージであることに気付きました。だから私はこのlinkのおかげでそれを再設計しました。SQL Server Service Broker - ドロップサービス

私の問題は、200万件のレコードを削除できなかったことです。私はこのlinkに示されているように以下のアプローチを使用し、クエリを実行したままにしました。私はそれをキャンセルするまで20時間実行しました。

declare @c uniqueidentifier 
while(1=1) 
begin 
    select top 1 @c = conversation_handle from dbo.queuename 
    if (@@ROWCOUNT = 0) 
    break 
    end conversation @c with cleanup 
end 

サービスとキューを削除しようとしていますが、もう一度時間がかかるようです。

drop service initiatorService 
drop queue initiatorQueue 

すぐに削除する別の方法はありますか?

キューデータ。 enter image description here

+0

データの例がありますか。それは現実的である必要はありませんが、あなたが削除しようとしている状態のデータの数行は素晴らしいでしょう。現時点では、コードがwhileループで効率的ではなく、SQLリソースを取り上げているので、時間がかかる理由がわかります。あなたの仕事が中止 –

+0

@ CodeWarrior私は、ドロップサービスがメッセージのコードを後で削除していると思います。 1時間後、私はメッセージの半分が削除されているのを見ました。 'end conversation'を使う最初のコードブロックは私の状態では役に立たず、' waitfor receive ... 'を使うべきです。私は確信しています。サンプルデータを追加しました。 – ibubi

+0

あなたは単純に '[table name] from message_type_name = 'http:// schemas.microsoft.com/sql.servicebroker/enddialog'の削除を試してみましたか? –

答えて

2

あなたがに喜んでいる場合を除き、私が知っているあなたの目標を達成するための近道は、ありません:

  • ドロップして、データベースを再作成、または
  • は、すべてのキュー内のすべてのService Brokerのデータをリセットし、しかし、私はを使用することをお勧めし、あなたのコードについて

- そのデータベース内のダイアログ自体を含む(ALTER DATABASE ... SET NEW_BROKER WITH ROLLBACK IMMEDIATE;この場合、リンクされた質問にレムスアドバイスに従うことを試みる場合があります)の代わりにselect;それ以外の場合は、同じダイアログを複数回表示することがあります。また、EndDialogメッセージが他のキューからキュー内に存在する場合は区別することもできます。

+0

あなたは正しいです、上記のコードで 'receive'なしでキューに満ちているメッセージを溶かすことができないことを理解しました。あなたの2番目の選択肢は私のものでした。 – ibubi

関連する問題