Tivemos um problema em nosso ambiente de desenvolvimento em que uma chamada de procedimento expirou do servidor da Web após 30 segundos. Rastreei a consulta e a executei manualmente (mesmos parâmetros e tudo) do SSMS e ela foi executada em cerca de 2 segundos. eu então corri
dbcc dropcleanbuffers
dbcc freeproccache
e depois disso, a chamada do servidor da web também foi concluída a tempo.
Eu suspeitaria que o mesmo plano deveria ser usado, pois estava usando exatamente os mesmos parâmetros de ambas as conexões, mas não tenho certeza.
Minha pergunta é: pode haver planos ou buffers diferentes para conexões diferentes? Ou poderia ter sido algum outro efeito colateral causado por eu executar os comandos dbcc acima?
Quando você diz "mesmos parâmetros e todos", pode descobrir que credenciais diferentes foram usadas ou que o mesmo plano compilado não foi reutilizado com base no tempo.
Suspeito aqui que a primeira chamada da web e a chamada do SSMS usaram planos diferentes. Os DBCCs então limparam o plano, então a segunda chamada da web funcionou conforme o esperado
Existem critérios que determinam a reutilização do plano, como o uso de esquema em todas as referências de objeto (por exemplo ,
dbo.table
nãotable
) que serão afetadas por diferentes credenciais.No entanto, o principal culpado geralmente é o sniffing de parâmetros. Ver
Caso contrário, algumas opções do SET também podem ser diferentes:
Nota: estes acompanham uma boa leitura em segundo plano...