Temos um gatilho Após Inserir e Atualizar em uma de nossas tabelas. O gatilho basicamente cria uma carga útil json e a enfileira em um sistema RabbitMQ.
Hoje um grande script de inserção foi executado na mesa (mais de 50.000 inserções). Este cenário não foi testado ou contabilizado e agora estamos tendo problemas de desempenho nesse banco de dados.
Notamos que o RabbitMQ está tendo os registros chegando lentamente por um longo período de tempo. Mesmo que os dados estejam no lugar por um tempo (porque é um After Trigger).
Parece que os gatilhos After foram enfileirados de alguma forma e estão trabalhando muito lentamente no sistema.
Como os eventos After Trigger são monitorados para execução? Eles estão na fila em algum lugar? Existe uma maneira que eu possa limpá-los?
Todos os Triggers são acionados dentro do escopo da mesma Transaction em que a
INSERT
instrução que os gerou é executada. Portanto, se a Transaction daINSERT
instrução que você executou foi concluída, o mesmo ocorreu com o After Insert Trigger que é acionado a partir dessaINSERT
instrução. Aqui estão algumas informações e testes diretos ao ponto que comprovam isso:Então, meu palpite é que seu original
INSERT
ainda está em execução (que pode ser abortado e revertido) ou o problema está em algum lugar entre depois que o Trigger é executado e o mecanismo que você está usando para despejar os dados no RabbitMQ.Você pode usar
sp_WhoIsActive
para determinar se suaINSERT
instrução ainda está em execução e obter o valorSPID
do processo para que você possa abortá-lo e reverter. Para abortar você teria que executarKILL 123
(onde 123 = oSPID
do seuINSERT
).Nota lateral, se por 50.000 inserções, você quer dizer 50.000 registros em uma
INSERT
instrução, então isso é pequeno e deve ter bom desempenho. Se você realmente quer dizer 50.000INSERT
declarações separadas, então essa é uma história diferente que pode levar muito mais tempo para concluir oINSERT
.