Estou tentando entender a saída de um SQL Trace de um banco de dados Oracle 12.2 no Windows. Eu usei TKPROF para interpretar os arquivos de rastreamento resultantes. Este utilitário gera uma saída de arquivo de texto e uma saída de arquivo SQL. Mas os dados não coincidem entre os dois arquivos.
Os dados foram gerados usando sintaxe comotkprof Trace.trc trace.trc.txt insert=trace.trc.sql
Para uma consulta específica, a saída TKPROF via arquivo de texto é:
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 13 0.04 0.03 0 0 1 0
Fetch 13 0.00 0.07 6 26 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 27 0.04 0.11 6 26 1 0
Mas a saída SQL do TKPROF gera dados para essa consulta que não tem os mesmos números da coluna Elapsed.
Aqui está a instrução Insert:
INSERT INTO tkprof_table (
date_of_insert, cursor_num, depth, user_id,
parse_cnt, parse_cpu, parse_elap, parse_disk, parse_query, parse_current, parse_miss,
exe_count, exe_cpu, exe_elap, exe_disk, exe_query, exe_current, exe_miss, exe_rows,
fetch_count, fetch_cpu, fetch_elap, fetch_disk, fetch_query, fetch_current, fetch_rows,
ticks, sql_statement
)
VALUES
(
SYSDATE, 4, 0, 9,
1, 0, 86, 0, 0, 0, 0,
13,46875, 31424, 0, 0, 1, 2, 0,
13, 0, 79075, 6, 26, 0, 0, 152918
, 'SELECT [...]')
E, em seguida, converter essas colunas SQL para corresponder ao layout da tabela do arquivo de texto que se torna:
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0 86 0 0 0 0
Execute 13 46875 31424 0 0 1 0
Fetch 13 0 79075 6 26 0 0
A documentação da Oracle diz que os valores de TKPROF Elapsed são
"tempo total decorrido em segundos para todas as chamadas de análise, execução ou busca para a instrução."
E acredito que seja preciso para a saída do arquivo de texto. Mas os dados SQL devem ser alguma outra medida. Não consigo encontrar nenhuma documentação que defina uma unidade de medida para os dados incompatíveis.
Há uma coluna "ticks", que parece corresponder aos ticks da CPU. Mas não sei se é isso que os valores incompatíveis são também. Em caso afirmativo, como faço para converter esses dados em segundos?
Ou parece que esses valores podem ser microssegundos. Isso é correto? Existe algum lugar que defina definitivamente essa unidade de medida?
Esses valores são ótimos. Eles são apenas truncados na saída do tkprof e exibidos como segundos em vez de microssegundos.
O tempo para execuções de SQL geralmente é medido em microssegundos.
Veja V$SQL por exemplo:
Tkprof também exibe o tempo em microssegundos na seção de operações de origem de linha (e exibe a unidade como
us
).Não encontrei nenhuma referência explícita para descrever todas as colunas de TKPROF_TABLE, informando que a unidade de tempo é microssegundo, mas é bastante lógico.