Estou tentando entender um problema que estamos enfrentando no SQL Server 2000. Somos um site moderadamente transacional e temos um processo armazenado chamado sp_GetCurrentTransactions
que aceita um ID do cliente e duas datas.
Agora, dependendo das datas e do cliente, essa consulta pode retornar de zero a 1000s de linhas.
O problema: o que experimentamos é que, de repente, obteremos vários erros (normalmente Execution Timeout Expired
ou similares) para um cliente em particular enquanto eles tentam executar o processo armazenado. Então, examinamos a consulta, executamos no SSMS e descobrimos que são necessários 30s. Por isso, recompilamos o proc armazenado e o -bang- é executado agora em 300ms.
Eu falei com o nosso DBA sobre isso. Ele me disse que o banco de dados criou um plano de consulta quando criamos o processo armazenado. Ele disse que era um bom plano para esse conjunto de parâmetros, mas se você lançar um determinado conjunto de parâmetros, o plano não será o melhor plano para esses dados e, portanto, você o verá lento.
As opções apresentadas são: mover essa consulta de problema de um processo armazenado e voltar ao SQL dinâmico, com seu plano de execução criado a cada execução.
Isso parece um passo para mim e sinto que deve haver uma maneira de contornar isso. Existe alguma outra maneira de lidar com esse problema?
Toda e qualquer resposta é apreciada.