Preparando instruções SQL

O mecanismo relacional SQL Server apresenta suporte completo na preparação de instruções SQL antes de elas serem executadas. Se um aplicativo tiver que executar uma instrução SQL várias vezes, poderá usar a API do banco de dados para fazer o seguinte:

  • Preparar a instrução uma vez. Esse procedimento compila a instrução SQL em um plano de execução.

  • Executar o plano de execução pré-compilado sempre que tiver de executar a instrução. Isso evita a necessidade de recompilar a instrução SQL em cada execução depois da primeira vez.

    A preparação e a execução de instruções são controladas por funções e métodos de API. Elas não fazem parte da linguagem Transact-SQL. O modelo de preparação/execução para executar instruções SQL é compatível com o SQL Server Native Client OLE DB Provider e o driver SQL Server Native Client ODBC. Em uma solicitação de preparação, o provedor ou o driver envia a instrução para o SQL Server com uma solicitação para preparar a instrução. O SQL Server compila um plano de execução e retorna um identificador para aquele plano ao provedor ou ao driver. Em uma solicitação de execução, o provedor ou o driver envia ao servidor uma solicitação para executar o plano associado ao identificador.

As instruções preparadas não podem ser usadas para criar objetos temporários no SQL Server. As instruções preparadas não podem fazer referência aos procedimentos armazenados do sistema que criam objetos temporários, como tabelas temporárias. Esses procedimentos devem ser executados diretamente.

O uso excessivo do modelo de preparação/execução pode diminuir o desempenho. Se uma instrução for executada apenas uma vez, uma execução direta exigirá apenas uma viagem de ida e volta da rede para o servidor. A preparação e a execução de uma instrução SQL executadas apenas uma vez exigem uma viagem de ida e volta adicional da rede; uma viagem para preparar a instrução e uma viagem para executá-la.

A preparação de uma instrução é mais eficaz se forem utilizados marcadores de parâmetro. Por exemplo, suponha que a recuperação de informações de produto do banco de dados de exemplo AdventureWorks2008R2 seja pedida ocasionalmente a um aplicativo. Há dois modos para o aplicativo fazer isso.

Usando o primeiro modo, o aplicativo pode executar uma consulta separada para cada produto solicitado:

SELECT * FROM AdventureWorks2008R2.Production.Product
WHERE ProductID = 63;

Usando o segundo modo, o aplicativo faz o seguinte:

  1. Prepara uma instrução contendo um marcador de parâmetro (?):

    SELECT * FROM AdventureWorks2008R2.Production.Product
    WHERE ProductID = ?;
    
  2. Associa uma variável de programa ao marcador de parâmetro.

  3. Sempre que as informações de produto são necessárias, preenche a variável de associação com o valor da chave e executa a instrução.

O segundo modo é mais eficiente quando a instrução é executada mais de três vezes.

No SQL Server, o modelo de preparação/execução não tem nenhuma vantagem de desempenho significativa sobre a execução direta, devido ao modo como o SQL Server reutiliza os planos de execução. O SQL Server tem algoritmos eficientes para corresponder as instruções SQL atuais aos planos de execução gerados para execuções anteriores da mesma instrução SQL. Se um aplicativo executar uma instrução SQL com marcadores de parâmetro várias vezes, o SQL Server reutilizará o plano de execução da primeira execução para a segunda e as execuções subsequentes (a menos que o plano fique mais antigo que o cache de procedimento). O modelo de preparação/execução ainda possui estes benefícios:

  • A localização de um plano de execução por um identificador é mais eficiente que os algoritmos usados para corresponder uma instrução SQL aos planos de execução existentes.

  • O aplicativo pode controlar quando o plano de execução é criado e quando é reutilizado.

  • O modelo de preparação/execução é portátil para outros bancos de dados, inclusive para versões anteriores do SQL Server.