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,它在等待