Execução preparada

Aplica-se a: SQL Server (todas as versões com suporte) SQL do Azure Banco de Dados Instância Gerenciada de SQL do Azure Azure Synapse PDW (Analytics Analytics Platform System)

A API ODBC define a execução preparada como uma maneira de reduzir a análise e a sobrecarga de compilação associada à execução repetida de uma instrução Transact-SQL. O aplicativo compila uma cadeia de caracteres que contém uma instrução SQL e então a executa em duas fases. Ele chama a Função SQLPrepare uma vez para que a instrução seja analisada e compilada em um plano de execução pelo Mecanismo de Banco de Dados. Em seguida, ele chama SQLExecute para cada execução do plano de execução preparado. Dessa forma, a sobrecarga de análise e compilação é salva em cada execução. A execução preparada geralmente é usada através de aplicativos para executar a mesma instrução SQL com parâmetros várias vezes.

Para a maioria dos bancos de dados, a execução preparada é mais rápida que a direta para instruções executadas mais de três ou quatro vezes primariamente, pois a instrução é compilada somente uma vez, enquanto instruções executadas diretamente são compiladas sempre que ocorrem. A execução preparada também pode fornecer uma redução no tráfego de rede, pois o driver pode enviar um identificador do plano de execução e os valores de parâmetro, em vez de toda uma instrução SQL, para a fonte de dados sempre que a instrução for executada.

SQL Server reduz a diferença de desempenho entre a execução direta e preparada por meio de algoritmos aprimorados para detectar e reutilização de planos de execução do SQLExecDirect. Isso torna alguns dos benefícios de desempenho da execução preparada disponíveis para instruções executadas diretamente. Para obter mais informações, consulte Execução Direta.

SQL Server também fornece suporte nativo para execução preparada. Um plano de execução é criado no SQLPrepare e executado posteriormente quando SQLExecute é chamado. Como SQL Server não é necessário para criar procedimentos armazenados temporários no SQLPrepare, não há sobrecarga extra nas tabelas do sistema no tempdb.

Por motivos de desempenho, a preparação da instrução é adiada até que SQLExecute seja chamado ou uma operação de metaproperty (como SQLDescribeCol ou SQLDescribeParam no ODBC) seja executada. Esse é o comportamento padrão. Não são conhecidos erros na instrução que está sendo preparada até que ela seja executada ou uma operação de metapropriedade seja executada. Definir o atributo SQL Server Native Client instrução específica do driver ODBC SQL_SOPT_SS_DEFER_PREPARE para SQL_DP_OFF pode desativar esse comportamento padrão.

No caso de preparação adiada, chamar SQLDescribeCol ou SQLDescribeParam antes de chamar SQLExecute gera uma viagem de ida e volta extra para o servidor. No SQLDescribeCol, o driver remove a cláusula WHERE da consulta e a envia para o servidor com SET FMTONLY ON para obter a descrição das colunas no primeiro conjunto de resultados retornado pela consulta. No SQLDescribeParam, o driver chama o servidor para obter uma descrição das expressões ou colunas referenciadas por quaisquer marcadores de parâmetro na consulta. Esse método também tem algumas restrições, como não poder resolver parâmetros em subconsultas.

O uso excessivo do SQLPrepare com o SQL Server Native Client driver ODBC degrada o desempenho, especialmente quando conectado a versões anteriores do SQL Server. A execução preparada não deve ser usada para instruções executadas uma única vez. A execução preparada é mais lenta que a direta para uma única execução de instrução, pois ela requer uma viagem de ida e volta extra do cliente ao servidor. Em versões anteriores do SQL Server ele também gera um procedimento armazenado temporário.

As instruções preparadas não podem ser usadas para criar objetos temporários no SQL Server.

Alguns aplicativos ODBC iniciais usavam SQLPrepare sempreque o SQLBindParameter era usado. SQLBindParameter não requer o uso do SQLPrepare, ele pode ser usado com SQLExecDirect. Por exemplo, use SQLExecDirect com SQLBindParameter para recuperar o código de retorno ou parâmetros de saída de um procedimento armazenado executado apenas uma vez. Não use SQLPrepare com SQLBindParameter , a menos que a mesma instrução seja executada várias vezes.

Consulte Também

Executando instruções (ODBC)