Dois dias atrás, um de nossos relatórios no Reporting Services começou a demorar muito mais para ser gerado. Seu tempo de geração aumentou de 4 segundos para 2 minutos.
Investigação encontrada:
O procedimento armazenado foi executado em 1 segundo e o plano de consulta foi aceitável
O relatório foi executado conforme o esperado em 4 segundos em uma máquina de desenvolvimento no Visual Studio
Assim que o relatório foi publicado no servidor de produção, ele ficou muito, muito mais lento.
O uso do monitor de atividade mostrou que o relatório estava sendo bloqueado com um bloqueio "LCK_M_S"
Ativei o rastreamento 1222 para verificar os impasses, mas nenhum impasse foi relatado.
A única informação que consegui sobre o que estava acontecendo foi pelo relatório "Top Transactions by Locks Count" para o banco de dados ReportServer. Ele listou as transações de bloqueio no ReportServerTempDB.
Esse padrão foi repetível com o relatório afetado por dois dias, você o executaria, veria o processo de bloqueio no monitor de atividades e o relatório demoraria muito mais 2 minutos.
No momento em que estávamos analisando o problema, ele desapareceu repentinamente , ninguém na equipe havia alterado nada, código ou dados, e agora o relatório voltou a ser executado em 3-4 segundos.
O que aconteceu?
Sem a intervenção do desenvolvedor, o relatório que levava repetidamente 2 minutos para ser executado e que durava 2 a 3 dias, de repente, volta a ser executado em 4 segundos e o processo de bloqueio visto no monitor de atividades desapareceu?
Um LCK_M_S é um problema de bloqueio, não um problema de deadlock. Então você está apenas esperando por outra coisa. Você precisa determinar qual processo está bloqueando você.
Portanto, "desapareceu repentinamente" porque esse bloco foi concluído ou falhou e foi revertido. Isto é normal. O que soa anormal em suas anotações ou em sua perspectiva é o comprimento do bloco.
Além de encontrar o processo de bloqueio, você também pode considerar o uso de um nível de isolamento de transação diferente. Por exemplo, embora não sem seus próprios problemas, você pode considerar o uso de níveis de isolamento "READ COMMITTED SNAPSHOT" ou "SNAPSHOT" para seu relatório. Isso permitiria ler os dados desde o início da transação e evitaria a maioria das situações de bloqueio.