目录
Active Session 活动会话
gv$active_session_history 每秒采集一次
dba_hist_active_sess_history 每10秒采集一次
背景
说明:
常用sql
直接使用V$ACTIVE_SESSION_HISTORY的sql
与其他表和视图共同查询更全面和可读的信息
V$ACTIVE_SESSION_HISTORY说明
名称 | 说明 |
v$session | 连接将产生会话,当前会话的信息保存在v$session中,连接断开后消失; |
v$session_wait | 将当前会话中正在等待的会话状态复制一份到视图,断开后消失(等待会话生命周期最后1次等待); |
v$session_wait_history | 保存每个活动session在v$session_wait中最近10次的等待事件(等待会话生命周期最后10次等待); |
Active Session | |
v$active_session_history gv$active_session_history | 在内存中保存,每秒从v$session_wait中采样一次(等待会话每秒的快照) |
dba_hist_active_sess_history | dba_hist_active_sess_history则会将gv$active_session_history里的数据每10秒采样一次并持久化保存。 |
表关系
v$session(ASH Buffer) —>v$active_session_history—>dba_hist_active_sess_history(AWR仓库)
ASH和AWR关系
背景
在很多情况下,当数据库发生性能问题的时候,我们并没有机会来收集足够的诊断信息,比如system state dump或者hang analyze,甚至问题发生的时候DBA根本不在场。这给我们诊断问题带来很大的困难。那么在这种情况下,我们是否能在事后收集一些信息来分析问题的原因呢?在Oracle 10G或者更高版本上,答案是肯定的。
说明:
在Oracle 10G中,我们引入了AWR和ASH采样机制,有一个视图gv$active_session_history会每秒钟将数据库所有节点的Active Session采样一次,而dba_hist_active_sess_history则会将gv$active_session_history里的数据每10秒采样一次并持久化保存。
ASH代表了近期活动的历史。 该图显示了当活动时如何采样会话。 每秒钟,Oracle数据库服务器查看活动会话,并记录这些会话正在等待的事件。 非活动会话不被采样。 采样非常高效,因为它直接访问Oracle数据库内部结构。
生成报告
SQL> @?/rdbms/admin/ashrpt.sql
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
----------- ------------ -------- ------------
42938845 ORA11G 1 ora11g
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'
Enter value for report_type: html --指定报告类型,此处使用html
Type Specified: html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
------------ -------- ------------ ------------ ------------
* 42938845 1 ORA11G ora11g ydq05
详见:Oracle活动会话历史(ASH)及报告解读_51CTO博客_oracle ash报告
常用sql
直接使用V$ACTIVE_SESSION_HISTORY的sql
查找最近一分钟内,最消耗CPU的sql语句
SELECT Sql_Id
,COUNT(*)
,Round(COUNT(*) / SUM(COUNT(*)) Over(), 2) Pctload
FROM V$active_Session_History
WHERE Sample_Time > SYSDATE - (1 / (24 * 60))
AND Session_Type <> 'BACKGROUND'
AND Session_State = 'ON CPU'
GROUP BY Sql_Id
ORDER BY COUNT(*) DESC;
查找最近一分钟内,最消耗I/O的sql语句
SELECT Ash.Sql_Id
,COUNT(*)
FROM V$active_Session_History Ash
,V$event_Name Evt
WHERE Ash.Sample_Time > SYSDATE - (1 / (24 * 60))
AND Ash.Session_State = 'WAITING'
AND Ash.Event_Id = Evt.Event_Id
AND Evt.Wait_Class = 'USER I/O'
GROUP BY Ash.Sql_Id
ORDER BY COUNT(*) DESC;
查找最近一分钟内,最消耗CPU的session
SELECT Session_Id
,COUNT(*)
FROM V$active_Session_History
WHERE Session_State = 'ON CPU'
AND Sample_Time > SYSDATE - 1 / (24 * 60)
GROUP BY Session_Id
ORDER BY COUNT(*) DESC;
查找最近一分钟内,最消耗资源的sql语句
SELECT Ash.Sql_Id
,SUM(Decode(Ash.Session_State, 'ON CPU', 1, 0)) "CPU"
,SUM(Decode(Ash.Session_State, 'WAITING', 1, 0)) -
SUM(Decode(Ash.Session_State, 'WAITING', Decode(En.Wait_Class, 'USER I/O', 1, 0), 0)) "WAIT"
,SUM(Decode(Ash.Session_State, 'WAITING', Decode(En.Wait_Class, 'USER I/O', 1, 0), 0)) "IO"
,SUM(Decode(Ash.Session_State, 'ON CPU', 1, 1)) "TOTAL"
FROM V$active_Session_History Ash
,V$event_Name En
WHERE Sql_Id IS NOT NULL
AND En.Event# = Ash.Event#
AND Ash.Sample_Time > SYSDATE - 1 / (24 * 60)
GROUP BY Ash.Sql_Id
ORDER BY SUM(Decode(Ash.Session_State, 'ON CPU', 1, 1)) DESC;
查找最近一分钟内,最消耗资源的session
SELECT Ash.Session_Id
,Ash.Session_Serial#
,Ash.User_Id
,Ash.Program
,SUM(Decode(Ash.Session_State, 'ON CPU', 1, 0)) "CPU"
,SUM(Decode(Ash.Session_State, 'WAITING', 1, 0)) -
SUM(Decode(Ash.Session_State, 'WAITING', Decode(En.Wait_Class, 'USER I/O', 1, 0), 0)) "WAITING"
,SUM(Decode(Ash.Session_State, 'WAITING', Decode(En.Wait_Class, 'USER I/O', 1, 0), 0)) "IO"
,SUM(Decode(Ash.Session_State, 'ON CPU', 1, 1)) "TOTAL"
FROM V$active_Session_History Ash
,V$event_Name En
WHERE En.Event# = Ash.Event#
AND Ash.Sample_Time > SYSDATE - 1 / (24 * 60)
GROUP BY Ash.Session_Id
,Ash.User_Id
,Ash.Session_Serial#
,Ash.Program
ORDER BY SUM(Decode(Ash.Session_State, 'ON CPU', 1, 1));
与其他表和视图共同查询更全面和可读的信息
确定那个对象有高的等待:
SELECT a.Current_Obj#
,o.Object_Name
,o.Object_Type
,a.Event
,SUM(a.Wait_Time + a.Time_Waited) Total_Wait_Time
FROM V$active_Session_History a
,Dba_Objects o
WHERE a.Sample_Time BETWEEN SYSDATE - 30 / 1440 AND SYSDATE
AND a.Current_Obj# = o.Object_Id
GROUP BY a.Current_Obj#
,o.Object_Name
,o.Object_Type
,a.Event
ORDER BY Total_Wait_Time DESC;
看看一段时间主要是那些等待事件:
SELECT a.Event
,SUM(a.Wait_Time + a.Time_Waited) Total_Wait_Time
FROM V$active_Session_History a
WHERE a.Sample_Time BETWEEN SYSDATE - 30 / 1440 AND SYSDATE
GROUP BY a.Event
ORDER BY Total_Wait_Time DESC;
看看那个回话有问题:
--只能查询最近的会准一点,回话退出就不行了
SELECT s.Sid
,s.Username
,SUM(a.Wait_Time + a.Time_Waited) Total_Wait_Time
FROM V$active_Session_History a
,V$session s
WHERE a.Sample_Time BETWEEN SYSDATE - 30 / 1440 AND SYSDATE
AND a.Session_Id = s.Sid
GROUP BY s.Sid
,s.Username
ORDER BY Total_Wait_Time DESC;
看看那个sql语句有问题。
这里查询的是v$sqlarea视图。 同样你可以使用视图DBA_HIST_ACTIVE_SESS_HISTORY代替v$active_session_history查询历史的信息。
SELECT a.User_Id
,d.Username
,s.Sql_Text
,SUM(a.Wait_Time + a.Time_Waited) Total_Wait_Time
FROM V$active_Session_History a
,V$sqlarea s
,Dba_Users d
WHERE a.Sample_Time BETWEEN SYSDATE - 15 / 1440 AND SYSDATE
AND a.Sql_Id = s.Sql_Id
AND a.User_Id = d.User_Id
GROUP BY a.User_Id
,s.Sql_Text
,d.Username
ORDER BY SUM(a.Wait_Time + a.Time_Waited) DESC;
V$ACTIVE_SESSION_HISTORY说明
V$ACTIVE_SESSION_HISTORY显示数据库中的采样会话活动。它包含每秒拍摄一次的活动数据库会话的快照。如果数据库会话在CPU上或正在等待不属于Idlewait类的事件,则认为该数据库会话处于活动状态。请参阅该V$EVENT_NAME视图以获取有关等待类的更多信息。
该视图为每个样本的每个活动会话包含一行,并首先返回最新的会话样本行。V$SESSION视图中显示活动会话历史记录中描述会话的大多数列。
字段 | 数据类型 | 描述 |
SAMPLE_ID | NUMBER | 样品编号 |
SAMPLE_TIME | TIMESTAMP(3) | 取样时间 |
SESSION_ID | NUMBER | 会话标识符;映射到V$SESSION.SID |
SESSION_SERIAL# | NUMBER | 会话序列号(用于唯一标识会话的对象);映射到V$SESSION.SERIAL# |
USER_ID | NUMBER | Oracle用户标识符;映射到V$SESSION.USER# |
SQL_ID | VARCHAR2(13) | 采样时会话正在执行的SQL语句的SQL标识符 |
SQL_CHILD_NUMBER | NUMBER | 采样时会话正在执行的SQL语句的子代号 |
SQL_PLAN_HASH_VALUE | NUMBER | 游标的SQL计划的数字表示形式。此信息可能不适用于所有会话样本。V$SESSION不包含此信息。 |
FORCE_MATCHING_SIGNATURE | NUMBER | CURSOR_SHARING参数设置为时使用的签名FORCE |
SQL_OPCODE | NUMBER | 指示SQL语句处于哪个操作阶段;映射到V$SESSION.COMMAND |
另请参见: “ V $ SESSION”以获取有关解释此列的信息 | ||
SERVICE_HASH | NUMBER | 标识服务的哈希值;映射到V$ACTIVE_SERVICES.NAME_HASH |
SESSION_TYPE | VARCHAR2(10) | 会话类型: |
FOREGROUND | ||
BACKGROUND | ||
SESSION_STATE | VARCHAR2(7) | 会话状态: |
WAITING | ||
ON CPU | ||
QC_SESSION_ID | NUMBER | 查询协调器会话ID。仅当采样的会话是并行查询从属时,此信息才可用。对于所有其他会话,该值为0。 |
QC_INSTANCE_ID | NUMBER | 查询协调器实例ID。仅当采样的会话是并行查询从属时,此信息才可用。对于所有其他会话,该值为0。 |
BLOCKING_SESSION | NUMBER | 阻止会话的会话标识符。仅在会话等待入队或“缓冲区繁忙”等待时填充。映射到V$SESSION.BLOCKING_SESSION。 |
BLOCKING_SESSION_STATUS | VARCHAR2(11) | 阻止会话的状态: |
VALID | ||
NO HOLDER | ||
GLOBAL | ||
NOT IN WAIT | ||
UNKNOWN | ||
BLOCKING_SESSION_SERIAL# | NUMBER | 阻止会话的序列号 |
EVENT | VARCHAR2(64) | 如果SESSION_STATE= WAITING,则在采样时会话正在等待的事件。 |
如果SESSION_STATE= ON CPU,则此列将为NULL。 | ||
另请参见: 附录C,“ Oracle等待事件” | ||
EVENT_ID | NUMBER | 会话正在等待或会话最后等待的资源或事件的标识符。解释与该EVENT列相似。 |
EVENT# | NUMBER | 会话正在等待或会话最后等待的资源或事件的编号。解释与该EVENT列相似。 |
SEQ# | NUMBER | 唯一标识等待的序列号(每次等待增加) |
P1TEXT | VARCHAR2(64) | 第一个附加参数的文本 |
P1 | NUMBER | 第一个附加参数 |
P2TEXT | VARCHAR2(64) | 第二个附加参数的文本 |
P2 | NUMBER | 第二个附加参数 |
P3TEXT | VARCHAR2(64) | 第三个附加参数的文本 |
P3 | NUMBER | 第三个附加参数 |
WAIT_CLASS | VARCHAR2(64) | 采样时会话正在等待的事件的等待类名称。解释与该EVENT列相似。映射到V$SESSION.WAIT_CLASS。 |
WAIT_CLASS_ID | NUMBER | 采样时会话正在等待的事件的等待类标识符。解释与该EVENT列相似。映射到V$SESSION.WAIT_CLASS_ID。 |
WAIT_TIME | NUMBER | 0 如果会话在采样时正在等待 如果会话在采样时位于CPU上,则会话最后等待的事件的总等待时间 无论WAIT_TIME=0是什么是有用的,找到SESSION_STATE在采样的时间,而不是实际的价值WAIT_TIME本身。Maps to V$SESSION.WAIT_TIME。 |
TIME_WAITED | NUMBER | 如果SESSION_STATE= WAITING,则会话实际等待该事件所花费的时间。此列设置为在取样时正在进行的等待。 如果一个等待事件持续了超过一秒钟,并且在多个会话样本行中被发现等待,那么等待该等待事件的实际时间将被填充在这些会话样本行的最后。在任何给定时间,此信息都将不适用于最新的会话样本。 |
XID | RAW(8) | 采样时会话正在处理的事务ID。V$SESSION不包含此信息。 |
CURRENT_OBJ# | NUMBER | 会话引用的对象的对象ID。仅当会话正在等待应用程序,群集,并发和用户I / O等待事件时,此信息才可用。映射到V$SESSION.ROW_WAIT_OBJ#。 |
CURRENT_FILE# | NUMBER | 包含会话正在引用的块的文件的文件号。仅当会话正在等待群集,并发和用户I / O等待事件时,此信息才可用。映射到V$SESSION.ROW_WAIT_FILE#。 |
CURRENT_BLOCK# | NUMBER | 会话引用的块的ID。仅当会话正在等待群集,并发和用户I / O等待事件时,此信息才可用。映射到V$SESSION.ROW_WAIT_BLOCK#。 |
PROGRAM | VARCHAR2(48) | 操作系统程序名称 |
MODULE | VARCHAR2(48) | 采样时执行模块的名称,由DBMS_APPLICATION_INFO.SET_MODULE过程设置 |
ACTION | VARCHAR2(32) | 采样时执行模块的名称,由DBMS_APPLICATION_INFO.SET_ACTION过程设置 |
CLIENT_ID | VARCHAR2(64) | 会话的客户端标识符;映射到V$SESSION.CLIENT_IDENTIFIER |
参考文章:
dba_hist_active_sess_history_自摆渡的博客-CSDN博客_dba_hist_active_sess_history
V $ ACTIVE_SESSION_HISTORY_allway2的博客-CSDN博客_v$active_session_historyOracle性能调整的三把利剑--ASH,AWR,ADDM - 程序员大本营
v$session,v$session_wait,v$session_wait_history,v$active_session_history - 无双的小宝 - 博客园