Partilhar via


Desempenho SQL dinâmico em ODBC

Embora o SQL estático funcione bem em muitas situações, existe uma classe de aplicações em que o acesso aos dados não pode ser determinado antecipadamente. Por exemplo, suponha que uma folha de cálculo permite ao utilizador introduzir uma consulta, que a folha de cálculo envia depois para o SGBD para recuperar os dados. O conteúdo desta consulta obviamente não pode ser conhecido pelo programador quando o programa da folha de cálculo é escrito.

Execução dinâmica

Para resolver este problema, a folha de cálculo utiliza uma forma de SQL embutido chamada SQL dinâmico. Ao contrário das instruções SQL estáticas, que são codificadas diretamente no programa, as instruções SQL dinâmicas podem ser construídas em tempo de execução e colocadas numa variável host de string. Depois, são enviados para o SGBD para processamento. Como o SGBD deve gerar um plano de acesso em tempo de execução para instruções SQL dinâmicas, o SQL dinâmico é geralmente mais lento do 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 para o SGBD; as instruções SQL estáticas no mesmo programa são tratadas normalmente.

A forma mais simples de executar uma instrução SQL dinâmica é com uma instrução EXECUTE IMEDIATAMENTE. Esta declaração passa a instrução SQL para o SGBD para compilação e execução.

Uma desvantagem da instrução EXECUTE IMMEDIATE é que o SGBD tem de passar por cada um dos cinco passos do processamento de uma instrução SQL cada vez que a instrução é executada. A sobrecarga envolvida neste processo pode ser significativa se muitas instruções forem executadas dinamicamente, e é um desperdício se essas instruções forem semelhantes.

Execução preparada

Para responder à situação acima, o SQL dinâmico oferece uma forma otimizada de execução chamada execução preparada, que utiliza os seguintes passos:

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

  2. O programa passa a instrução SQL para o SGBD com uma instrução PREPARE, que pede que o SGBD analise, valide e otimize a instrução e gere um plano de execução para a mesma. O programa utiliza então uma instrução EXECUTE (e não uma instrução EXECUTE IMMEDIATE) para executar a instrução PREPARE posteriormente. Transmite valores de parâmetros para a instrução através de uma estrutura de dados especial chamada SQL Data Area ou SQLDA.

  3. O programa pode usar repetidamente a instrução EXECUTAR, fornecendo valores de parâmetro diferentes cada vez que a instrução dinâmica é executada.

A execução preparada não é a mesma coisa que SQL estático. No SQL estático, os primeiros quatro passos do processamento de uma instrução SQL ocorrem em tempo de compilação. Na execução preparada, estes passos continuam a acontecer em tempo de execução, mas só são feitos uma vez. A execução do plano ocorre apenas quando EXECUTE é chamado. Este comportamento ajuda a eliminar algumas das desvantagens de desempenho inerentes à arquitetura do SQL dinâmico.

Consulte também

EXECUTAR (Transact-SQL)
sp_executesql (Transact-SQL)