数据库session分析表

目录

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_historydba_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_IDNUMBER样品编号
SAMPLE_TIMETIMESTAMP(3)取样时间
SESSION_IDNUMBER会话标识符;映射到V$SESSION.SID
SESSION_SERIAL#NUMBER会话序列号(用于唯一标识会话的对象);映射到V$SESSION.SERIAL#
USER_IDNUMBEROracle用户标识符;映射到V$SESSION.USER#
SQL_IDVARCHAR2(13)采样时会话正在执行的SQL语句的SQL标识符
SQL_CHILD_NUMBERNUMBER采样时会话正在执行的SQL语句的子代号
SQL_PLAN_HASH_VALUENUMBER游标的SQL计划的数字表示形式。此信息可能不适用于所有会话样本。V$SESSION不包含此信息。
FORCE_MATCHING_SIGNATURENUMBERCURSOR_SHARING参数设置为时使用的签名FORCE
SQL_OPCODENUMBER指示SQL语句处于哪个操作阶段;映射到V$SESSION.COMMAND
另请参见: “ V $ SESSION”以获取有关解释此列的信息
SERVICE_HASHNUMBER标识服务的哈希值;映射到V$ACTIVE_SERVICES.NAME_HASH
SESSION_TYPEVARCHAR2(10)会话类型:
FOREGROUND
BACKGROUND
SESSION_STATEVARCHAR2(7)会话状态:
WAITING
ON CPU
QC_SESSION_IDNUMBER查询协调器会话ID。仅当采样的会话是并行查询从属时,此信息才可用。对于所有其他会话,该值为0。
QC_INSTANCE_IDNUMBER查询协调器实例ID。仅当采样的会话是并行查询从属时,此信息才可用。对于所有其他会话,该值为0。
BLOCKING_SESSIONNUMBER阻止会话的会话标识符。仅在会话等待入队或“缓冲区繁忙”等待时填充。映射到V$SESSION.BLOCKING_SESSION。
BLOCKING_SESSION_STATUSVARCHAR2(11)阻止会话的状态:
VALID
NO HOLDER
GLOBAL
NOT IN WAIT
UNKNOWN
BLOCKING_SESSION_SERIAL#NUMBER阻止会话的序列号
EVENTVARCHAR2(64)如果SESSION_STATE= WAITING,则在采样时会话正在等待的事件。
如果SESSION_STATE= ON CPU,则此列将为NULL。
另请参见: 附录C,“ Oracle等待事件”
EVENT_IDNUMBER会话正在等待或会话最后等待的资源或事件的标识符。解释与该EVENT列相似。
EVENT#NUMBER会话正在等待或会话最后等待的资源或事件的编号。解释与该EVENT列相似。
SEQ#NUMBER唯一标识等待的序列号(每次等待增加)
P1TEXTVARCHAR2(64)第一个附加参数的文本
P1NUMBER第一个附加参数
P2TEXTVARCHAR2(64)第二个附加参数的文本
P2NUMBER第二个附加参数
P3TEXTVARCHAR2(64)第三个附加参数的文本
P3NUMBER第三个附加参数
WAIT_CLASSVARCHAR2(64)采样时会话正在等待的事件的等待类名称。解释与该EVENT列相似。映射到V$SESSION.WAIT_CLASS。
WAIT_CLASS_IDNUMBER采样时会话正在等待的事件的等待类标识符。解释与该EVENT列相似。映射到V$SESSION.WAIT_CLASS_ID。
WAIT_TIMENUMBER0 如果会话在采样时正在等待
如果会话在采样时位于CPU上,则会话最后等待的事件的总等待时间

无论WAIT_TIME=0是什么是有用的,找到SESSION_STATE在采样的时间,而不是实际的价值WAIT_TIME本身。Maps to V$SESSION.WAIT_TIME。
TIME_WAITEDNUMBER如果SESSION_STATE= WAITING,则会话实际等待该事件所花费的时间。此列设置为在取样时正在进行的等待。
如果一个等待事件持续了超过一秒钟,并且在多个会话样本行中被发现等待,那么等待该等待事件的实际时间将被填充在这些会话样本行的最后。在任何给定时间,此信息都将不适用于最新的会话样本。
XIDRAW(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#。
PROGRAMVARCHAR2(48)操作系统程序名称
MODULEVARCHAR2(48)采样时执行模块的名称,由DBMS_APPLICATION_INFO.SET_MODULE过程设置
ACTIONVARCHAR2(32)采样时执行模块的名称,由DBMS_APPLICATION_INFO.SET_ACTION过程设置
CLIENT_IDVARCHAR2(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 - 无双的小宝 - 博客园

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要进行数据库负荷分析,可以按照以下步骤进行: 1. 监控性能指标: - 使用数据库管理工具或命令行工具来监控数据库的性能指标。 - 下面是一些常用的命令示例: - Oracle: - 监控实例级别的性能指标: ```sql SELECT * FROM v$sysstat; SELECT * FROM v$system_event; SELECT * FROM v$resource_limit; ``` - 监控会话级别的性能指标: ```sql SELECT * FROM v$session; SELECT * FROM v$session_event; SELECT * FROM v$session_wait; ``` - SQL Server: - 监控实例级别的性能指标: ```sql SELECT * FROM sys.dm_os_performance_counters; SELECT * FROM sys.dm_os_wait_stats; SELECT * FROM sys.dm_os_ring_buffers; ``` - 监控会话级别的性能指标: ```sql SELECT * FROM sys.dm_exec_requests; SELECT * FROM sys.dm_exec_sessions; SELECT * FROM sys.dm_exec_query_stats; ``` - MySQL: - 监控实例级别的性能指标: ```sql SHOW GLOBAL STATUS; SHOW ENGINE INNODB STATUS; SHOW GLOBAL VARIABLES; ``` - 监控会话级别的性能指标: ```sql SHOW PROCESSLIST; SHOW SESSION STATUS; ``` 2. 分析查询性能: - 检查执行时间较长的查询语句,找出潜在的性能瓶颈。 - 使用数据库提供的性能分析工具或命令来分析查询的执行计划和性能统计信息。 - 下面是一些常用的命令示例: - Oracle: ```sql EXPLAIN PLAN FOR <your_query>; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` - SQL Server: ```sql SET STATISTICS TIME ON; SET STATISTICS IO ON; <your_query>; ``` - MySQL: ```sql EXPLAIN <your_query>; ``` 3. 检查等待事件: - 分析数据库中的等待事件,了解哪些操作导致了等待。 - 使用数据库提供的等待事件监控工具或命令来查看等待事件和相关统计信息。 - 下面是一些常用的命令示例: - Oracle: ```sql SELECT * FROM v$system_event; SELECT * FROM v$session_event; SELECT * FROM v$session_wait; ``` - SQL Server: ```sql SELECT * FROM sys.dm_os_wait_stats; SELECT * FROM sys.dm_exec_requests; SELECT * FROM sys.dm_exec_session_wait_stats; ``` - MySQL: ```sql SHOW ENGINE INNODB STATUS; ``` 以上是一些常用的数据库负荷分析方法和命令示例。请注意,确切的命令和工具可能会因数据库类型和版本而有所不同。在实际应用中,建议参考相关的文档和官方指南,以获取更准确和详细的命令和工具信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值