O problema que você está enfrentando é (quase certamente) devido a um plano de consulta em cache, que é apropriado para algumas versões de parâmetros passados para a consulta, mas não para outras (também conhecidas como Parameter Sniffing).
Esta é uma ocorrência comum, e muitas vezes é agravada por estatísticas desatualizadas e/ou índices muito fragmentados.
Primeiro passo :verifique se você reconstruiu todos os seus índices e se as estatísticas em colunas não indexadas estão atualizadas. (Além disso, certifique-se de que seu cliente tenha um trabalho de manutenção de índice agendado regularmente)
exec sp_msforeachtable "DBCC DBREINDEX('?')"
go
exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go
Esta é a referência canônica:Slow in the Application, Fast in SSMS?
Se o problema persistir após a reconstrução dos índices e a atualização das estatísticas, você terá algumas opções:
-
Use SQL dinâmico (mas leia isto primeiro:The Curse and Blessings ofDynamic SQL)
-
UseOPTIMIZE FOR
-
UseWITH(RECOMPILE)