アプリの前回のリリースでは、Service Brokerキューに何かが到着したときに待機するように指示するコマンドを追加しました。
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
DBAは、追加以来、ログサイズが屋根を通過したことを教えてくれました。これは正しいですか?それとも私は他の場所を探すべきですか?
アプリの前回のリリースでは、Service Brokerキューに何かが到着したときに待機するように指示するコマンドを追加しました。
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
DBAは、追加以来、ログサイズが屋根を通過したことを教えてくれました。これは正しいですか?それとも私は他の場所を探すべきですか?
回答:
アクティブなオープントランザクションはログを固定し、切り捨てを防ぎ、最終的に成長を引き起こします。トランザクションを開始し、ログに書き込み、メッセージが最終的に目覚めることを期待して永遠に待機する場合、ログを固定して、それを成長させます。
最近、私は、ループとともに、アクティブ化された手順でWAITFORを避けることを推奨し始めました。RECIEVeを発行して完了すると、アクティベーションメカニズムがループし(実行されます)、WAITFORではなく、単なるRECEIVEになります。
RECEIVEのWAITFORフレーバーは、内部的にセーブポイントを作成します。これによりログ(少なくとも3つのログレコード)が生成され、待機中に実際にログが固定されます。長いWAITFORタイムアウト(またはさらに悪いことに無限)を設定することは、非常に悪い習慣です。
WAITFOR (RECEIVE...
あなたが拡大してもらえますか?おそらく、私は誤解した。
begin transaction; waitfor(receive...)
待機中にログレコードを生成しない(トランザクションを「アクティブ化しない」)ため、ログを固定しません。唯一のbegin transaction;[insert|update|delete];waitfor(receive...)
「アクティブ」にトランザクションを引き起こす(ログレコードを生成する)ので、待っている間、実際にログを固定しますします。
SQL Server 2008 R2では、WAITFOR(RECEIVE)を実行してからDBCC OPENTRANを実行すると、以前の更新がない場合でもトランザクションがアクティブとして表示されます。
WAITFOR (...) TIMEOUT 3600000
問題を解決しますか?たとえば、1時間ごとにリリースします。