Pular para o conteúdo
Visualizando 11 posts - 1 até 11 (de 11 do total)
  • Autor
    Posts
  • #78884
    punk_doido
    Participante

      Ola galera… alguem pode me ajudar..

      Já li alguma coisa sobre mas agora não encontro novamente.
      Imaginando uma tabela qualquer em que uma aplicação qualquer faz repedidamente o mesmo select nessa tabela somente mudando o valor de algum campo que esteja na clausula where. O oracle gera o plano de execução na 1º vez e utiliza ele para as demais vezes, otimizando assim o desempenho. Mas se a aplicação mudar os valores dos campos de maneira “errada”, o Oracle acaba gerando o plano de execução toda santa vez, gerando assim uso de CPU desnecessário. Sobre esse assunto que eu queria entender melhor. Alguem pode explicar? Basicamente quero saber se é isso mesmo, como faco para verificar isso, se tem algum campo da session da aplicação que posso verificar isso….essas coisas.

      Obrigado.

      #78885
      Marcio68Almeida
      Participante

        Se você faz a seguinte consulta repetidamente :
        Select * from tabela where codigo = '1'
        O banco irá gerar um único parse, se o valor comparado for diferente, então ele fará um parse para cada consulta, nesse caso você deve usar o seguinte recurso :
        Select * from tabela where codigo = :codigo
        onde codigo é uma variável de ambiente…

        #78888
        punk_doido
        Participante

          Entendi. Mas na pratica, tenho um programa em Java que faz diversas execuções repetidas por horas, tem como olhando a conexão do aplicativo no banco descobrir quantos parse ele esta fazendo ?

          Obrigado pela ajuda!

          #78890
          chduarte
          Participante

            Voce consegue ver isso na v$sql. Primeiro descruba o sql_hash_value na v$session.

            []

            #78894
            punk_doido
            Participante

              Estou fazendo uns testes aqui…. se eu rodar a seguinte query 10 vezes:

              select nome from teste a1 where cod = :cod

              Verificando na V$SQLAREA ele diz que faz o parte 10 vezes:

              SQL_TEXT=select nome from teste a1 where cod = :cod
              MODULE= T.O.A.D.
              PARSE_CALLS=10

              Não era para ser somente 1 ? O que tem de errado ? Sendo que a variavel cod pode ter o mesmo valor as 10 vezes tanto valores diferentes que o resultado do parte é o mesmo.

              Obrigado galera pela ajuda!!!

              #78895
              chduarte
              Participante

                Verifique o seu parametro cursor_sharing.

                Altere ele para force na sessao e veja novamente.

                SQL> alter session set cursor_sharing = force;

                []

                #78896
                punk_doido
                Participante

                  Obrigado pela ajuda!

                  Não funcionou, continuou na mesma. Tem mais alguma ideia ?

                  Valeu…..

                  #78897
                  chduarte
                  Participante

                    Verifique se voce nao esta confundindo o parse de uma query, que é a verificacao se a query é valida com o hard parse, que é o mais custoso:

                    SELECT pa.sid, pa.value “Hard Parses”, ex.value “Execute Count”
                    FROM v$sesstat pa, v$sesstat ex
                    WHERE pa.sid=ex.sid
                    AND pa.statistic#=(select statistic#
                    FROM v$statname where name=’parse count (hard)’)
                    AND ex.statistic#=(select statistic#
                    FROM v$statname where name=’execute count’)
                    AND pa.value>0
                    and pa.sid =
                    ;

                    []

                    #78900
                    punk_doido
                    Participante

                      Realmente deu uma puta diferença agora. Nos testes que eu fiz essa coluna
                      v$sesstat.pa é bem diferente da V$SQLAREA.PARSE_CALLS.

                      O que significa essa que estava usando entao ?

                      Então relacionado com esse assunto só preciso me preocupar com a v$sesstat.pa para ter certeza de que algum sistema não está executando sempre a mesma query e o banco está sempre fazendo parse nela ?

                      Obrigadão!!!

                      #78901
                      chduarte
                      Participante

                        Resumindo a missa é:

                        Hard Parse: É feito quando a sua query ou plano de execucao ou metadata nao estao na shared_pool.

                        Soft Parse: É feito quando a sua query ou plano de execucao ou metadata nao estao shared_pool.

                        Fatores como plano de execucao e as binds podem alterar o tipo de parse que sera realizado mas é um assunto um pouco complexo.

                        Este link: http://download-east.oracle.com/docs/cd … .htm#45403 te da mais infos.

                        []

                        #78902
                        punk_doido
                        Participante

                          Obrigado Carlos pela ajuda, vou estudar mais a fundo e depois conto as novidades!!!

                        Visualizando 11 posts - 1 até 11 (de 11 do total)
                        • Você deve fazer login para responder a este tópico.
                        plugins premium WordPress