Na última versão do meu aplicativo, adicionei um comando que diz para esperar quando algo chegar na fila do Service Broker:
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
Os DBAs me disseram que, desde a adição, os tamanhos de toras dispararam. Isso pode estar correto? Ou devo procurar em outro lugar?
Qualquer transação aberta ativa fixará o log, impedindo o truncamento e eventualmente causando crescimento. Se você iniciar uma transação, escreva no log e espere para sempre na esperança de que uma mensagem acabe acordando você, você apenas fixou o log e fez com que ele crescesse.
Ultimamente comecei a recomendar às pessoas que evitem o WAITFOR no procedimento ativado, junto com o loop. Apenas emita um RECIEVe e pronto, deixe o mecanismo de ativação fazer um loop para você (ele faz) e não ESPERE, simplesmente RECEBA.
O tipo WAITFOR de RECEIVE cria um ponto de salvamento internamente. Isso gera log (pelo menos 3 registros de log) e, de fato, fixa o log no lugar enquanto espera. Ter um longo tempo limite de WAITFOR (ou pior, infinito) seria uma prática muito ruim.
No SQL Server 2008 R2, se eu executar um WAITFOR(RECEIVE), depois executar DBCC OPENTRAN, ele mostra a transação como ativa, mesmo na ausência de atualizações anteriores.