如何理解 Oracle 中跟踪文件的统计信息。如CPU、经过时间、查询...等

Posted

技术标签:

【中文标题】如何理解 Oracle 中跟踪文件的统计信息。如CPU、经过时间、查询...等【英文标题】:How to understand statistics of trace file in Oracle. Such as CPU, elapsed time, query...etc 【发布时间】:2018-10-15 12:55:26 【问题描述】:

我正在学习 Oracle 中的查询优化,我知道跟踪文件将创建有关查询执行和查询的 EXPLAIN 计划的统计信息。

在跟踪文件的底部,它是查询的解释计划。我的第一个问题是,“time = 136437 us”部分是否显示查询执行步骤的持续时间? “我们”是什么意思?是时间单位吗?

另外,谁能解释一下count、cpu、elapsed、disk和query等统计数据是什么意思?我已经谷歌并阅读了有关它们的 Oracle 文档,但我仍然无法理解。谁能更清楚地阐明这些统计数据的含义?

提前致谢。我是新手,对我的英语感到抱歉。

【问题讨论】:

μs - 微秒,百万分之一秒。 Oracle 手册中的Guidelines for Interpreting TKPROF Output 有帮助吗? 嗨,我不确定我是否了解行源操作?它具有以微秒为单位的时间统计信息。当我优化查询时。我需要关心行源操作时间吗?还是我只需要关心 CPU 和经过的时间? 【参考方案1】:

Oracle 数据库中数据访问的最小单位是块。不是一排。

每个块可以存储许多行。

数据库可以在当前或一致模式下访问块。

当前 = 因为块“现在”存在。 一致 = 因为在您的查询开始时已被阻止。

查询和当前列报告数据库以一致(查询)和当前模式访问块的次数。

当访问一个块时,它可能已经在缓冲区缓存(内存)中。如果是这样,则不需要磁盘访问。如果没有,它必须进行物理读取(pr)。磁盘列是总物理读取的计数。

计划中每一行的统计数据是该操作的数据。加上其所有子操作的总和。

简单来说,数据库通过首先访问第一个孩子来处理计划。然后将行向上传递给父级。然后按顺序排列该父级的所有其他子操作。子操作在显示中从其父操作缩进。

所以数据库像这样处理您的查询:

    从 CUSTOMER 读取 2,000 行。这需要 749 次一致的块获取和 363 次磁盘读取(此行上的 cr 和 pr 值)。这需要 10,100 微秒。 从 BOOKING 中读取 112,458 行。这进行了 8,203 次一致读取和零磁盘读取。这花费了 337,595 微秒 使用散列连接将这两个表连接在一起。 CR、PR、PW(物理写入)和时间值是以下操作的总和。加上这个操作所做的任何工作。所以哈希连接: 做了 8,952 - ( 749 + 8,203 ) = 零一致读取 363 - ( 363 + 0 ) = 零物理读取 执行耗时 1,363,447 - ( 10,100 + 337,595 ) = 1,015,752 微秒

注意哈希连接的 CR 和 PR 总计与 fetch 行中的查询和磁盘总计相匹配?

计数列报告该操作发生的次数。提取是对数据库的调用以获取行。因此客户端调用了数据库 7,499 次。每次收到 ceil(112,458 / 7,499) = 15 行。

CPU 是服务器的处理器执行该步骤的总时间(以秒为单位)。 Elapsed 是挂钟的总时间。这是 CPU 时间 + 任何额外的工作。比如磁盘读取、网络时间等。

【讨论】:

感谢您的回答。我的问题是:为什么行源操作时间不如 CPU 时间重要。在Guidelines for Interpreting TKPROF Output。来自 Oracle,它说“如果可以接受 7.01 CPU 秒并检索 824 行,那么您无需进一步查看此跟踪输出。”为什么行源操作时间和经过时间不如 CPU 时间重要。这让我很困惑。 行源统计数据是每个步骤所用时间的细分。而在理想情况下,大部分经过的时间应该是 CPU 时间。 TKPROF 输出可以包含许多语句。对于其中的每一个,您都需要回答以下问题:“此语句是否足够快?”这就是那句话的意思:鉴于 SQL 所做的工作,是否值得尝试调整它?您只需查看该问题答案为“是”的语句的行源统计信息。

以上是关于如何理解 Oracle 中跟踪文件的统计信息。如CPU、经过时间、查询...等的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Trace dbms_monitor

Oracle Trace dbms_monitor

如何使用Oracle跟踪文件?

oracle11g怎么不自动收集统计信息

如何查询Oracle数据库的操作日志

如何在 Oracle 12c 中跟踪 sql 查询?