BIND Variables, vilão ou herói?

Sempre levantamos a bandeira da utilização de bind variables como boa prática.

No entanto, será que temos consciência de tudo o que cerca na utilização deste recurso?

Vamos aos pontos chave:

  • É verdade que as bind variables reduzem o hard parsing, já que há um compartilhamento de cursores. Isso é bom, pois reduz tempo de CPU.
  • E é verdade que pode provocar esquizofrenias, em determinados momentos parece que o Oracle executa uma mesma query em um tempo depois demora mais, sem contar que é notório mudanças de plano de execução.

Bem, a diminuição de hard parsing com bind variables(BV) já é bem conhecido e  compreendido, não há muitas questões. O objetivo deste meu post é aprofundar um pouco no ponto 2, que agora chamaremos de Bind Peeking.

A melhor definição que tenho para este evento é:

“Quando as bind variables estão peeked, significa dizer ao CBO que é seguro gerar o plano de execução baseado no valor da BV e este plano será utilizado para as demais execuções, sem se importar com os diferentes valores que vem na BV.

Quando não está peeked então o CBO desconfia sempre dos valores da BV e gera planos de execução adaptado ao valor da BV.”

Ihhhh,,, como dizia Shakespeare, to be or not to be, that’s the question.

É importante ressaltar que o principal vilão ou herói desta questão são o histogramas, pois somente estes é que permite o CBO calcular o nível de seletividade em uma coluna.

No entanto é importante lembrar e clarificar que simplesmente apagar os histogramas não é uma solução, já que podemos aumentar o hard parsing e ainda os histogramas podem ser muito bem úteis. Imagina no caso de uma tabela onde temos uma distribuição:

  • 60% do valor A.
  • 30% do valor B.
  • 10% do valor C.

Se tiramos os histogramas, podemos tirar a possibilidade de utilizar índices para buscar o valor C ou do full scan para buscar valores A.

Isso é mais um jogo do tipo, os dois lados da moeda. O mais importante é sempre ter um plano de atualização e manutenção de estatísticas robusta, como também um boa implementação e utilização dos bind variables.

Existe um tratamento cirúrgico para essas diferenças de plano de execução e performance, que é a utilização de SQL Profiles, tema do meu próximo post.

Saudações Vascaínas….

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s