Performance 正确的计算方法";总等待时间“;在oracle中会话的

Performance 正确的计算方法";总等待时间“;在oracle中会话的,performance,oracle,session,wait,Performance,Oracle,Session,Wait,我需要找出会话处于活动状态时会话等待的总时间。 为此,我使用了如下查询 SELECT (SUM (wait_time + time_waited) / 1000000) FROM v$active_session_history WHERE session_id = 614 但是,我觉得使用这个查询并没有得到我想要的。 比如,当我第一次运行这个查询时,我得到了145.980962,@second time=145.953926,@3rd time我得到了127.706429 理想情况下

我需要找出会话处于活动状态时会话等待的总时间。

为此,我使用了如下查询

SELECT (SUM (wait_time + time_waited) / 1000000)
  FROM v$active_session_history
 WHERE session_id = 614 
但是,我觉得使用这个查询并没有得到我想要的。 比如,当我第一次运行这个查询时,我得到了145.980962,@second time=145.953926,@3rd time我得到了127.706429

理想情况下,时间应相同或增加。但是,正如您所看到的,每次返回的值都在减少


请纠正我哪里做错了。

它不包含整个历史记录,
v$active\u session\u history
“忘记”旧的行。把它想象成一个缓冲圈。写入所有缓冲区后,它将从第一个缓冲区重新启动
要获取某些会话的事件,请查看
v$session\u event

要获取活动会话的当前(活动)事件:
v$session\u wait
(在最新的Oracle版本中,您也可以在
v$session
中找到此信息)

注意:v$session\u事件视图不会显示CPU时间(这不是事件,但可以在
v$active\u session\u历史记录中看到)。例如,如果需要,您可以从
v$sesstat
添加它。

它不包含整个历史记录,
v$active\u session\u history
“忘记”旧的行。把它想象成一个缓冲圈。写入所有缓冲区后,它将从第一个缓冲区重新启动
要获取某些会话的事件,请查看
v$session\u event

要获取活动会话的当前(活动)事件:
v$session\u wait
(在最新的Oracle版本中,您也可以在
v$session
中找到此信息)

注意:v$session\u事件视图不会显示CPU时间(这不是事件,但可以在
v$active\u session\u历史记录中看到)。您可以添加它,例如,如果需要,可以从
v$sesstat
添加…

您的错误在于您不了解
v$active\u session\u history
:它是一个示例而不是日志。也就是说,ASH中的每个记录都是一个时间点,并且不引用以前的记录

别担心,这是常见的错误

这是
WAIT\T
IME的一个特殊问题。这是等待该事件特定发生的总时间。因此,如果等待事件跨越两个样本,则在第一个记录中,等待时间将为1(1秒),在下一个样本中,等待时间将为2(两秒)。但是,一个
和(等待时间)
将产生总共3个,这太多了。当然,这是一个算术过程,因此如果等待事件延长到10个样本(10秒),那么
和(等待时间)
将产生总共55个样本

基本上,
WAIT\u TIME
是一个标志-如果它是0,会话在CPU上,如果它大于0,它在等待

TIME\u waitied
仅在事件停止等待时填充。所以一个
和(你等待的时间
)不会给出一个夸大的值。事实恰恰相反:它将只为采样时正在进行的等待事件填充。因此,在样本的间隙之间可能会有很多等待,而这些间隙不会出现在总数中

这就是为什么ASH有利于突出重大性能问题,而不利于识别背景琐事

那么为什么每次运行查询时总时间不增加呢?因为灰烬是一种循环缓冲器。旧记录会老化,以便为新样本让路。AWR在磁盘上存储一定百分比的ASH记录;可以通过DBA_HIST_ACTIVE_SESSION_HIST
访问这些记录(默认为十分之一记录)。因此,在运行查询的第二次和第三次之间,可能会有一些等待时间很长的示例。您可以通过在选择列表中包含
MIN(采样时间)
来检查这一点

最后,请记住,小岛屿发展中国家得到了重用。识别会话的主键是
(SID,Serial#)
,您的查询仅按SID进行分组,因此它可能会使用来自多个不同会话的数据

格雷厄姆·伍兹(Graham Woods)做了一个有用的演讲,他是研究灰烬的甲骨文大师之一,名为“在灰烬中移动”。尽管听格雷厄姆讲话会更好,但幻灯片本身仍然提供了一些有用的见解

tl;dr

灰烬是一个样本,而不是一个日志。用它来计数而不是求和


“查询这些表的方式有问题吗?”

正如我上面所说的,但可能还不够清楚,
DBA\u HIST\u ACTIVE\u SESSION\u HIST
只保存来自ASH的一小部分记录。因此,在其列上运行
SUM()
比在live ASH上运行更有意义


V$SESSION\u EVENT
是事件的实际日志。其等待时间可靠且准确。这就是为什么您要支付启用的开销。话虽如此,
V$SESSION\u EVENT
只为我们提供每个会话的聚合值,因此它在诊断中并不特别有用。

你的错误在于你没有理解
V$active\u SESSION\u history
:它是一个示例,而不是一个日志。也就是说,ASH中的每个记录都是一个时间点,并且不引用以前的记录

别担心,这是常见的错误

这是
WAIT\T
IME的一个特殊问题。这是等待该事件特定发生的总时间。因此,如果等待事件跨越两个样本,则在第一个记录中,等待时间将为1(1秒),在下一个样本中,等待时间将为2(两秒)。但是,一个
和(等待时间)
将产生总共3个,这太多了。当然,这是一个算术过程,因此如果等待事件延长到10个样本(10秒),那么
和(等待时间)
将产生总共55个样本

基本上,
WAIT\u TIME
是一个标志-如果它是0,会话在CPU上,如果它大于0,它在等待