› Fóruns › Banco de dados Oracle › Excesso de leituras físicas › Excesso de leituras físicas
@mpvargas
FINDING 5: 2% impact (63 seconds)
Instruções SQL não foram compartilhadas em decorrência do uso de literais.
Isso resultou em parses adicionais que estavam consumindo um tempo de banco de dados significativo.
RECOMMENDATION 1: Application Analysis, 2% benefit (63 seconds)
ACTION: Investigue a lógica da aplicação para o possível uso de
variáveis de bind em vez de literais.
ACTION: Como alternativa, você pode definir o parâmetro
"cursor_sharing" como "force".
SYMPTOMS THAT LED TO THE FINDING:
SYMPTOM: Hard parses de instruções SQL estavam consumindo um tempo de banco de dados significativo. (2,1% impact [64 seconds])
Muitos desenvolvedores não conhecem variavel BIND, e simplesmente adicionam os valores direto nos filtros das consultas, exemplo:
Primeira consulta:
SELECT CODIGO,NOME,SOBRENOME
FROM PESSOA
WHERE CODIGO = 12
Segunda consulta:
SELECT CODIGO,NOME,SOBRENOME
FROM PESSOA
WHERE CODIGO = 44
Terceira consulta:
SELECT CODIGO,NOME,SOBRENOME
FROM PESSOA
WHERE CODIGO = 56
Como não foi utilizado variavel BIND, o oracle teve que fazer o parser da mesma consulta 3 vezes, devido o valor no filtro o oracle não sabe que é a mesma consulta.
Agora utilizando variavel BIND, a consulta iria chegar assim:
SELECT CODIGO,NOME,SOBRENOME
FROM PESSOA
WHERE CODIGO = :1
Tem duas soluções, tinha esquecido de uma…
ACTION: Investigue a lógica da aplicação para o possível uso de
variáveis de bind em vez de literais.
ACTION: Como alternativa, você pode definir o parâmetro
"cursor_sharing" como "force".
Se tiver como alterar as consultas, implante variavel BIND, se não altere o parâmetro cursor_sharing. A alteração do parâmetro eu nunca fiz, não sei das consequências.