Pular para o conteúdo
  • Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 13 anos, 1 mês atrás por Fábio Prado.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #105048
    eversonpiza
    Participante

      Pessoal,

      Estou a algum tempo com algumas duvidas na analise de arquivos trace, pesquisei em vários locais, mas ainda não consegui sanar minhas duvidas. Espero poder contar a valiosa ajuda de vocês.

      Primeira duvida:
      call count cpu elapsed disk query current rows
      ------- ------ -------- ---------- ---------- ---------- ---------- ----------
      Parse 352 0.03 0.04 0 0 0 0
      Execute 434 0.05 0.05 0 0 0 0
      Fetch 2359 6.97 104.50 130 460857 0 3665
      ------- ------ -------- ---------- ---------- ---------- ---------- ----------
      total 3145 7.05 104.60 130 460857 0 3665

      Para eu saber o tempo médio de cada chamada a essa consulta, qual conta devo fazer?

      104/434 = 0.24
      104/3145 = 0.03

      Outra? Porque?

      Segunda duvida:

      call count cpu elapsed disk query current rows
      ------- ------ -------- ---------- ---------- ---------- ---------- ----------
      Parse 45 0.00 0.00 0 0 0 0
      Execute 19232 0.79 0.92 0 0 0 0
      Fetch 19232 0.90 0.90 0 0 0 19232
      ------- ------ -------- ---------- ---------- ---------- ---------- ----------
      total 38509 1.70 1.82 0 0 0 19232

      Como faço para saber quantas vezes essa consulta foi executada?
      Achei esse número 19232 muito alto, e fui olhar o arquivo de trace ‘bruto’ e o select só aparece 40 e poucas vezes.

      Agradeço a ajuda de vocês.

      Everson

      #105051
      Fábio Prado
      Participante

        @Everson,

        Respondendo a sua primeira dúvida, o tempo médio de cada consulta vc terá que dividir na linha "total", os valores de elapsed por count. No seu exemplo seria:
        
         104.60/3145 = 0.03
        

        Quanto à 2a. dúvida, para saber o total de vezes que foi executada a instrução SQL, é só ver o valor da coluna “count” da linha “execute”, ok?

        Eu ensino a interpretar os traces nos meus treinamentos de SQL Tuning (http://www.fabioprado.net/p/performance-tuning-oracle-database.html).

        []s

        Fábio Prado

        #105053
        eversonpiza
        Participante

          Olá Fábio,
          bom dia.

          Eu também pensava assim, até me deparar com alguns casos onde esses números não faziam sentido, ai resolvi pesquisar um pouco mais..

          Olha o que achei na documentação da oracle sobre o execute que aparece no trace

          [i]EXECUTE
          Actual execution of the statement by Oracle. For INSERT, UPDATE, and DELETE statements, this modifies the data. For SELECT tatements, this identifies the selected rows.[/i]

          Em nenhum lugar eu achei a informação de quantas vezes a consulta foi realmente chamada.

          Outra coisa ‘estranha’ que achei, formatei o trace usado o tkprof com a opção de aggregate=no, ou seja, ele não juntou as consultas iguais, mostrando uma a uma, e olha o select abaixo feito na dual, até onde eu sei, ou sabia, o execute count dele deveria ser 1.

          select TO_CHAR(TO_DATE(:b0,'DD/MM/YYYY'),'DD/MM/YYYY') into :b1
          from
          DUAL

          call count cpu elapsed disk query current rows


          Parse 1 0.00 0.00 0 0 0 0
          Execute 742 0.05 0.10 0 0 0 0
          Fetch 742 0.03 0.03 0 0 0 742


          total 1485 0.08 0.14 0 0 0 742

          Misses in library cache during parse: 0
          Optimizer mode: RULE
          Parsing user id: 500

          Rows Row Source Operation


          742  FAST DUAL  (cr=0 pr=0 pw=0 time=1666 us)</code>
          

          #105055
          Fábio Prado
          Participante

            Everson,

            Eu respondi correndo e agora eu vi que eu realmente havia respondido errado, portanto, para compensar vou dar uma explicação adicional.

            Toda instrução SQL, pode ser executada internamente no BD em até 3 passos (parse, execute e fetch), mas apenas 2 são obrigatórios (parse e execute) para toda instrução SQL.

            O parse é uma fase da execução em que o Otimizador do Oracle analisa basicamente a sintaxe e a semântica da instrução SQL e monta um plano de execução para ela.

            O execute é a fase em que o Otimizador realmente executa a instrução SQL, conforme “plano de execução” montado no estágio anterior.

            O fetch é a fase em que o Otimizador retorna os dados para a sessão de usuário e isso só acontece em instruções SELECT, por isso essa fase não é executada, por exemplo, em instruções INSERT, UPDATE e DELETE.

            Quando vc executa uma instrução SQL, dependendo do modo que ela foi executada, ela pode ter 1 ou N parses. O ideal e mais performático é que aconteça o menor número possível de parses, ou seja, apenas 1. Se vc por exemplo, executar uma instrução SELECT contendo uma variável bind, 15 vezes, ela poderá ter apenas 1 parse, 15 executes e 15 fetchs. Normalmente a qtde de executes e fetchs são iguais em instruções SQL e é isso que sempre vejo ocorrer. Quando vc vê no trace um bloco em que a qtde de fechs e executes são diferentes, é pq vc está vendo uma seção de agrupamento de valores de várias instruções SQL, ok?

            Segue abaixo um exemplo de trace em que eu executei 5 vezes a instrução “SELECT * FROM HR.EMPLOYEES WHERE ROWNUM < 8":

            Interpretando o trace acima e respondendo as suas questões:

            1- se eu quero saber quantas vezes a instrução SQL foi executada é só verificar o valor da coluna count na linha Execute.

            2- se eu quiser saber o tempo total de execução (considerando fetch + execute + parse), é só dividir o valor da coluna “elapsed” na linha total pelo valor da coluna “count “na linha execute.

            Agora respondi sua questão? Na próxima, para facilitar, acrescente também a instrução SQL para ficar mais fácil de interpretar.

            []s

            Fábio Prado
            http://www.fabioprado.net

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