Recompilando procedimentos armazenados

Como um banco de dados é alterado por ações como adicionar índices ou alterar dados em colunas indexadas, os planos de consulta originais usados para acessar essas tabelas devem ser otimizados novamente por recompilação. Essa otimização acontece automaticamente na primeira vez em que um procedimento armazenado é executado após a reinicialização de MicrosoftSQL Server. Isso também ocorre se uma tabela subjacente usada pelo procedimento armazenado for alterada. Entretanto, se um novo índice for adicionado do qual o procedimento armazenado pode se beneficiar, a otimização não ocorrerá até a próxima vez em que o procedimento armazenado for executado após a reinicialização de SQL Server. Nessa situação, pode ser útil forçar o procedimento armazenado a ser recompilado na próxima vez em que for executado.

Outro motivo para forçar a recompilação de um procedimento armazenado é neutralizar, quando necessário, o comportamento “sugador de parâmetro” da compilação de procedimento armazenado. Quando SQL Server executa procedimentos armazenados, quaisquer valores de parâmetro usados pelo procedimento em sua compilação são incluídos como parte da geração do plano de consulta. Se esses valores representam aqueles típicos com os quais o procedimento é chamado subseqüentemente, então o procedimento armazenado beneficia-se do plano de consulta cada vez que ele é compilado ou executado. Se não, o desempenho pode ser afetado.

ObservaçãoObservação

SQL Server 2008 oferece recompilação no nível da instrução de procedimentos armazenados. Quando SQL Server 2008 recompila procedimentos armazenados, só a instrução que causou a recompilação é compilada, em lugar de todo o procedimento. Como resultado, SQL Server usa os valores de parâmetro existentes na instrução recompilada ao gerar novamente o plano de consulta. Esses valores podem diferir dos originalmente passados ao procedimento.

Forçando a recompilação de um procedimento armazenado

SQL Server fornece três modos de forçar a recompilação de um procedimento armazenado:

  • O procedimento armazenado do sistema sp_recompile força a recompilação de um procedimento armazenado na próxima vez em que este for executado. Isso é feito com a exclusão do plano existente do cache de procedimento que força um novo plano a ser criado na próxima vez que o procedimento for executado.

  • Criar um procedimento armazenado que especifique a opção WITH RECOMPILE em sua definição indica que SQL Server não armazena em cache um plano para esse procedimento armazenado; o procedimento armazenado será recompilado sempre que for executado. Use a opção WITH RECOMPILE quando os procedimentos armazenados obtiverem parâmetros cujos valores diferirem significativamente entre execuções do procedimento armazenado e fizerem com que planos de execução diferentes sejam criados a cada vez. O uso dessa opção é incomum e faz com que o procedimento armazenado seja executado mais devagar, pois ele deverá ser recompilado sempre que for executado.

    Se você desejar que apenas consultas individuais dentro do procedimento armazenado sejam recompiladas, em vez de todo o procedimento, especifique a dica de consulta RECOMPILE em cada consulta que desejar compilar. Esse comportamento imita o comportamento de recompilação no nível da instrução de SQL Server observado acima, mas além de usar os valores de parâmetro atuais do procedimento armazenado, a dica de consulta RECOMPILE também usa os valores de quaisquer variáveis locais dentro do procedimento armazenado ao compilar a instrução. Use essa opção quando valores atípicos ou temporários são usados em apenas um subconjunto de consultas pertencentes ao procedimento armazenado. Para obter mais informações, consulte Dica de consulta (Transact-SQL).

  • Você pode forçar o procedimento armazenado a ser recompilado especificando a opção WITH RECOMPILE ao executar o procedimento armazenado. Use essa opção apenas se o parâmetro sendo fornecido for atípico ou se os dados tiverem sido alterados significativamente desde que o procedimento armazenado foi criado.

    ObservaçãoObservação

    Se um objeto referenciado por um procedimento armazenado for excluído ou renomeado, ocorrerá um erro quando o procedimento armazenado for executado. Se, no entanto, um objeto referenciado em um procedimento armazenado for substituído por um objeto do mesmo nome, o procedimento armazenado será executado sem precisar ser recriado.

Para recompilar um procedimento armazenado na próxima vez em que for executado