Resolução e compilação de nome diferida

Quando um procedimento armazenado é criado, as instruções no procedimento são analisadas quanto à exatidão sintática. Se um erro sintático for encontrado na definição do procedimento, será retornado um erro e o procedimento armazenado não será criado. Se as instruções estiverem sintaticamente corretas, o texto do procedimento armazenado será armazenado na exibição de catálogo sys.sql_modules.

Quando um procedimento armazenado for executado pela primeira vez, o processador da consulta lerá o texto do procedimento armazenado da exibição de catálogo sys.sql_modules e verificará se os nomes dos objetos usados pelo procedimento estão presentes. Esse processo é chamado de resolução de nome diferida porque os objetos de tabela referenciados pelo procedimento armazenado não existem quando o procedimento é criado, apenas quando ele é executado.

ObservaçãoObservação

A resolução de nome diferida só pode ser usada ao referenciar objetos de tabela inexistentes. Todos os outros objetos devem existir no momento em que o procedimento armazenado é criado. Por exemplo, ao referenciar uma tabela inexistente em um procedimento armazenado você não pode listar colunas inexistentes para essa tabela.

No estágio de resolução, Microsoft SQL Server também executa outras atividades de validação (por exemplo, a verificação da compatibilidade de um tipo de dados de coluna com variáveis). Se os objetos referenciados pelo procedimento armazenado estiverem ausentes quando o procedimento for executado, a execução do procedimento armazenado será interrompida ao chegar à instrução que faz referência ao objeto ausente. Nesse caso, ou se forem localizados outros erros na fase de resolução, um erro será retornado.

ObservaçãoObservação

Se um objeto referenciado por um procedimento armazenado for excluído ou renomeado, será retornado um erro quando o procedimento armazenado for executado. Entretanto, se 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. Por exemplo, se o procedimento armazenado Proc1 referenciar a tabela Test1 e Test1 for excluída e uma tabela diferente chamada Test1 for criada, Proc1 fará referência à nova tabela. O procedimento armazenado não precisa ser recriado.

Se uma execução de procedimento passar com sucesso pelo estágio de resolução, o otimizador de consultas Microsoft SQL Server analisará as instruções Transact-SQL no procedimento armazenado e criará um plano de execução. O plano de execução descreve o método mais rápido de executar o procedimento armazenado, baseado em informações como:

  • A quantidade de dados nas tabelas.

  • A natureza e a presença de índices nas tabelas e a distribuição de dados nas colunas indexadas.

  • Os operadores de comparação e valores de comparação usados nas condições da cláusula WHERE.

  • A presença de junções e palavra-chave UNION, GROUP BY e ORDER BY.

Depois que o otimizador de consultas analisar esses fatores no procedimento armazenado, ele colocará o plano de execução na memória. O processo de analisar o procedimento armazenado e criar um plano de execução é chamado de compilação. O plano de execução otimizado na memória é usado para executar a consulta. O plano de execução permanece na memória até que SQL Server seja reiniciado ou até que o espaço seja necessário para armazenamento de outro objeto.

Quando o procedimento armazenado for executado subseqüentemente, SQL Server reusará o plano de execução existente caso ainda esteja na memória. Se o plano de execução não estiver mais na memória, um novo plano de execução será criado.