- 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.
-
AutorPosts
-
30 de janeiro de 2013 às 9:36 pm #105048
eversonpiza
ParticipantePessoal,
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 3665Para eu saber o tempo médio de cada chamada a essa consulta, qual conta devo fazer?
104/434 = 0.24
104/3145 = 0.03Outra? 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 19232Como 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
1 de fevereiro de 2013 às 1:47 am #105051Fá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.03Quanto à 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
1 de fevereiro de 2013 às 2:57 pm #105053eversonpiza
ParticipanteOlá 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
DUALcall 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: 500Rows Row Source Operation
742 FAST DUAL (cr=0 pr=0 pw=0 time=1666 us)</code>1 de fevereiro de 2013 às 8:25 pm #105055Fábio Prado
ParticipanteEverson,
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 -
AutorPosts
- Você deve fazer login para responder a este tópico.
