Pular para o conteúdo

Fóruns Banco de dados Oracle Excesso de leituras físicas Excesso de leituras físicas

#102131
rman
Participante

    @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.