Compartilhar via


Desempenho dinâmico do SQL no ODBC

Embora o SQL estático funcione bem em muitas situações, há uma classe de aplicativos em que o acesso a dados não pode ser determinado antecipadamente. Por exemplo, suponha que uma planilha permita que um usuário insira uma consulta, que a planilha envia ao DBMS para recuperar dados. Obviamente, o conteúdo da consulta não pode ser conhecido pelo programador quando o programa de planilha é escrito.

Execução dinâmica

Para resolver esse problema, a planilha usa uma forma de SQL incorporado chamada SQL dinâmico. Diferentemente das instruções SQL estáticas, que são codificadas no programa, as instruções SQL dinâmicas podem ser criadas em tempo de execução e colocadas em uma variável de host de cadeia de caracteres. Em seguida, são enviadas ao SGBD para processamento. Como o DBMS deve gerar um plano de acesso em tempo de execução para instruções SQL dinâmicas, o SQL dinâmico geralmente é mais lento que o SQL estático. Quando um programa que contém instruções SQL dinâmicas é compilado, as instruções SQL dinâmicas não são removidas do programa, como no SQL estático. Em vez disso, são substituídas por uma chamada de função que passa a instrução ao DBMS; instruções SQL estáticas no mesmo programa são tratadas normalmente.

A maneira mais simples de executar uma instrução SQL dinâmica é com uma instrução EXECUTE IMMEDIATE. Esta instrução passa a instrução SQL ao DBMS para compilação e execução.

Uma desvantagem da instrução EXECUTE IMMEDIATE é que o DBMS deve passar por cada uma das cinco etapas de processamento de uma instrução SQL cada vez que a instrução é executada. A sobrecarga envolvida nesse processo poderá ser significativa se muitas instruções forem executadas dinamicamente, e será um desperdício se essas instruções forem semelhantes.

Execução preparada

Para resolver a situação acima, o SQL dinâmico oferece uma forma otimizada de execução chamada execução preparada, que usa as seguintes etapas:

  1. O programa constrói uma instrução SQL em um buffer, assim como faz para a instrução EXECUTE IMMEDIATE. Em vez de variáveis de host, um ponto de interrogação (?) pode substituir uma constante em qualquer lugar do texto da instrução para indicar que um valor para a constante será fornecido posteriormente. O ponto de interrogação é chamado de marcador de parâmetro.

  2. O programa passa a instrução SQL ao DBMS com uma instrução PREPARE, que solicita que o DBMS analise, valide e otimize a instrução e gere um plano de execução para ela. Em seguida, o programa usa uma instrução EXECUTE (não uma instrução EXECUTE IMMEDIATE) para executar a instrução PREPARE posteriormente. Ele passa valores de parâmetros para a instrução por meio de uma estrutura de dados especial chamada SQL Data Area, ou SQLDA.

  3. O programa pode usar a instrução EXECUTE repetidamente, fornecendo valores de parâmetros diferentes sempre que a instrução dinâmica é executada.

A execução preparada ainda não é igual ao SQL estático. No SQL estático, as primeiras quatro etapas do processamento de uma instrução SQL ocorrem em tempo de compilação. Na execução preparada, essas etapas ainda ocorrem em tempo de execução, mas são executadas apenas uma vez. A execução do plano ocorre somente quando EXECUTE é chamado. Esse comportamento ajuda a eliminar algumas das desvantagens de desempenho inerentes à arquitetura do SQL dinâmico.

Confira também

EXECUTE (Transact-SQL)
sp_executesql (Transact-SQL)