Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
Base de Dados SQL do Azure
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
A API ODBC define a execução preparada como uma forma de reduzir a sobrecarga de análise e compilação associada à execução repetida de uma instrução Transact-SQL. A aplicação constrói uma cadeia de caracteres contendo uma instrução SQL e depois executa-a em duas etapas. Chama a Função SQLPrepare uma vez para que a instrução seja analisada e compilada num plano de execução pelo Database Engine. Depois, chama SQLExecute para cada execução do plano de execução preparado. Isto poupa a sobrecarga de análise e compilação em cada execução. A execução preparada é frequentemente usada por aplicações para executar repetidamente a mesma instrução SQL parametrizada.
Para a maioria das bases de dados, a execução preparada é mais rápida do que a execução direta para instruções executadas mais de três ou quatro vezes, principalmente porque a instrução é compilada apenas uma vez, enquanto as instruções executadas diretamente são compiladas cada vez que são executadas. A execução preparada também pode proporcionar uma redução do tráfego de rede, pois o driver pode enviar um identificador do plano de execução e os valores dos parâmetros, em vez de uma instrução SQL completa, para a fonte de dados cada vez que a instrução é executada.
O SQL Server reduz a diferença de desempenho entre execução direta e preparada através de algoritmos melhorados para detetar e reutilizar planos de execução do SQLExecDirect. Isto torna alguns dos benefícios de desempenho da execução preparada disponíveis para instruções executadas diretamente. Para mais informações, consulte Execução Direta.
O SQL Server também oferece suporte nativo para execução preparada. Um plano de execução é construído sobre SQLPrepare e posteriormente executado quando SQLExecute é chamado. Como o SQL Server não é obrigado a construir procedimentos armazenados temporários no SQLPrepare, não há sobrecarga adicional nas tabelas do sistema no tempdb.
Por razões de desempenho, a preparação da declaração é adiada até ser chamada SQLExecute ou até que seja realizada uma operação de metapropriedade (como SQLDescribeCol ou SQLDescribeParam em ODBC). Este é o comportamento padrão. Quaisquer erros na declaração a preparar não são conhecidos até que a instrução seja executada ou seja realizada uma operação de metapropriedade. Definir a SQL Server SQL_SOPT_SS_DEFER_PREPARE atributo de instrução ODBC específica do driver ODBC para SQL_DP_OFF pode desativar este comportamento predefinido.
No caso de preparação diferida, chamar SQLDescribeCol ou SQLDescribeParam antes de chamar SQLExecute gera uma viagem extra de ida e volta ao servidor. No SQLDescribeCol, o driver remove a cláusula WHERE da consulta e envia-a para o servidor com SET FMTONLY ON para obter a descrição das colunas do primeiro conjunto de resultados devolvida 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âmetros na consulta. Este método também tem algumas restrições, como não conseguir resolver parâmetros em subconsultas.
O uso excessivo de SQLPrepare com o driver ODBC do SQL Server Native Client degrada o desempenho, especialmente quando ligado a versões anteriores do SQL Server. A execução preparada não deve ser usada para declarações executadas uma única vez. A execução preparada é mais lenta do que a execução direta para uma única execução de uma instrução porque requer uma ida e volta extra da rede do cliente para o servidor. Nas versões anteriores do SQL Server, também gera um procedimento armazenado temporário.
Instruções preparadas não podem ser usadas para criar objetos temporários no SQL Server.
Algumas aplicações ODBC iniciais usavam SQLPrepare sempre que o SQLBindParameter era utilizado. O SQLBindParameter não requer o uso do SQLPrepare, pode ser usado com o SQLExecDirect. Por exemplo, use SQLExecDirect com SQLBindParameter para recuperar o código de retorno ou parâmetros de saída de um procedimento armazenado que é executado apenas uma vez. Não use SQLPrepare com SQLBindParameter a menos que a mesma instrução seja executada várias vezes.