我正在尝试理解 Windows 上 Oracle 12.2 数据库的 SQL Trace 输出。我使用 TKPROF 来解释生成的跟踪文件。该实用程序生成一个文本文件输出和一个 SQL 文件输出。但是两个文件之间的数据不匹配。
数据是使用类似语法生成的tkprof Trace.trc trace.trc.txt insert=trace.trc.sql
对于特定查询,通过文本文件输出的 TKPROF 是:
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
但是 TKPROF 的 SQL 输出为该查询生成的数据在 Elapsed 列中没有相同的数字。
这是插入语句:
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 [...]')
然后转换这些 SQL 列以匹配文本文件的表布局,变成:
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
Oracle 的文档说 TKPROF Elapsed 值是
“语句的所有解析、执行或提取调用的总耗用时间(以秒为单位)。”
我相信这对于文本文件输出是准确的。但是 SQL 数据必须是一些其他的度量。我找不到任何为不匹配数据定义度量单位的文档。
有一个“ticks”列,似乎对应于 CPU ticks。但我不知道不匹配的值是否也是如此。如果是这样,我如何将该数据转换为秒数?
或者看起来这些值可能是微秒。那是对的吗?有没有明确定义该度量单位的地方?
这些值很好。它们只是在 tkprof 输出中被截断并显示为秒而不是微秒。
SQL 执行的时间通常以微秒为单位。
参见V$SQL示例:
Tkprof 还在行源操作部分以微秒为单位显示时间(并将单位显示为
us
)。我没有找到任何明确的参考来描述 TKPROF_TABLE 的所有列,说明时间单位是微秒,但它很合乎逻辑。