› Fóruns › Banco de dados Oracle › Excesso de leituras físicas › Excesso de leituras físicas
@mpvargas
Apenas um breve explicação sobre a utilização ou não de bind variables,
Lendo brevemente o tópico vi que existe uma sugestão para aumentar a SGA do banco. Dentro da SGA está alocada a shared pool, que é a área aonde ficam armazenadas informações compartilhadas sobre os comandos SQL executados… essa área é util para economizar o trabalho de PARSE do banco. (você pode ter uma ‘idéia’ da shared pool por exemplo pela view v$sqlarea)
Onde entra o tal do BIND nisso tudo…
imagina que cada linha da v$sqlarea é um comando sql executado..
Agora imagina que sua aplicação possui uma telinha com um filtro simples por ID
select id, nome from tabela where id = 10
Para cada ID diferente q é feita essa pesquisa, é feito um parse completo, e alocado espaço na shared pool (gastando memória e CPU)
Dai,, imagina a quantidade dessas consultas simples que podem haver,, para cada ID…
Mas o comando SQL é o mesmo,, se ele vier com BIND da aplicação, vai ser entendido assim pelo banco:
select id, nome from tabela where id = :V_BIND
Então,, independente da quantidade de IDs diferentes que forem consultados, é SEMPRE a mesma consulta,, não alocando mais espaço nem gastando muita CPU para fazer o tal do HARD PARSE.
Como no seu caso, o ERP é uma aplicação fechada, e vc não tem controle sobre como estes comandos são enviados pro banco, pode considerar alterar um parâmetro no banco chamado CURSOR_SHARING para FORCE… ele força a utilização de bind variables pelo otimizador..
Esse parâmetro é dinâmico, e vc pode alterá-lo até pode uma trigger de logon,, fazendo assim pode filtrar uma determinada maquina, ou usuário para testes..
Quanto a necessidade de corrigir querys,, se for 11g, existe a possibilidade de se trocar o plano de execução de uma determinada query por outro que você sabe que é melhor..
Mas só lembrando,, sempre testar BEM este tipo de alteração para não ser um tiro no pé (principalmente o cursor_sharing)