Existem duas maneiras de enviar comandos e suas variáveis para o SGBD. A primeira consiste em concatenar, na aplicação, antes de enviar o comando para o banco de dados o valor de todas as variáveis. A segunda maneira é utilizando bind variables, que consiste em enviar o comando e suas variáveis separadamente.
Poucos desenvolvedores sabem os benefícios do uso de bind variables no que diz respeito à escalabilidade e desempenho, e por isso, não dão a devida importância.
Quando o SGBD recebe um comando para ser executado, o primeiro passo é realizar o parse do comando. Durante o parse o banco de dados realiza diversas validações como verificação de sintaxe do comando e validações de segurança. Uma vez que o comando é validado o SGBD faz seu plano execução, que consiste em determinar a melhor forma para se executar o comando solicitado. Devido ao elevado custo associado à realização da atividade de parse de um comando os SGBDs guardam em memória um histórico dos planos de execução. Assim, nas próximas execuções do mesmo comando, o banco reutiliza as informações armazenadas anteriormente eliminando a necessidade de realizar novamente o parse desse comando.
Como, normalmente, os comandos de uma aplicação são fixos e o que muda são apenas os valores das variáveis, a utilização de bind variables permite a reutilização dos planos de execução armazenados em memória, o que resulta em um ganho de performance significativo.
Como eu acredito que o texto acima não é suficiente para convencer a maioria dos desenvolvedores vejamos na prática. O exemplo abaixo mostra um código em PL/SQL bem simples que faz um loop e executa mil vezes o mesmo select.
No primeiro caso as variáveis são concatenadas ao comando antes de enviá-lo para execução no SGBD. A execução demorou 25.05 segundos. Agora vejamos o mesmo código utilizando bind variables.
Como o uso de bind variables a execução do mesmo código demorou apenas 0.19 segundos.
Agora esse mesmo exemplo sem o uso de bind variables em Java.
Como podemos ver acima, a execução do exemplo em JAVA sem o uso de bind Variables demorou 27,658 segundos. Agora vejamos o mesmo código utilizando bind variables.
Como o uso de bind variables a execução demorou apenas 0.828 segundos.
Assim como no exemplo em PL/SQL, o ganho de performance obtido com o uso de bind variables no JAVA também é significativo.
Então a regra é tirar toda e qualquer concatenação dos comandos que serão enviados para o banco? Não. Essa técnica só se aplica para variáveis. Além disso, comandos que não são executados freqüentemente não se beneficiarão do uso de bind variables.

home



blog de design do c.e.s.a.r.