Menu Close

v$active_session_history与dba_hist_active_sess_history差异

1. (g)v$active_session_history (活动session历史信息记录——ASH)

V$ACTIVE_SESSION_HISTORY 显示数据库中的采样会话活动。它包含每秒执行一次的活动数据库会话的快照(隔时间由 _ash_sampling_interval=1000 参数确定)。如果数据库会话在CPU上或正在等待不属于Idlewait类的事件,则认为该数据库会话是活动的。对于每个活动的session,每次采样会记录一行,并保存在ASH buffer中,重启则会消失,用做ash报表。

Active sessions are sampled every second and are stored in a circular buffer in SGA. Any session that is connected to the database and is waiting for an event that does not belong to the Idle wait class is considered as an active session. This includes any session that was on the CPU at the time of sampling.每秒对活动会话进行采样,并将其存储在SGA的循环缓冲区中。连接到数据库并正在等待不属于空闲等待类的事件的任何会话都被视为活动会话,这包括采样时在CPU上的任何会话。

Each session sample is a set of rows and the V$ACTIVE_SESSION_HISTORY view returns one row for each active session per sample, returning the latest session sample rows first. Because the active session samples are stored in a circular buffer in SGA, the greater the system activity, the smaller the number of seconds of session activity that can be stored in the circular buffer. This means that the duration for which a session sample appears in the V$ view, or the number of seconds of session activity that is displayed in the V$ view, is completely dependent on the database activity.(每个会话样本都是一组行,V$ACTIVE_SESSION_HISTORY视图为每个样本的每个活动会话返回一行,首先返回最新的会话样本行。由于活动会话样本存储在SGA中的循环缓冲区中,因此系统活动越大,可存储在循环缓冲区中的会话活动秒数就越小。这意味着会话样本在V$视图中显示的持续时间或在V$视图中显示的会话活动的秒数完全取决于数据库活动。)

As part of the Automatic Workload Repository (AWR) snapshots, the content of V$ACTIVE_SESSION_HISTORY is also flushed to disk. Because the content of this V$ view can get quite large during heavy system activity, only a portion of the session samples is written to disk.(作为自动工作负载存储库(AWR)快照的一部分,V$ACTIVE_SESSION_HISTORY的内容也会刷新到磁盘。由于在繁重的系统活动期间,此视图的内容可能会变得非常大,因此只有一部分会话示例被写入磁盘。)

SELECT *
  FROM gv$active_session_history t
 WHERE t.inst_id = &instance_Id
   AND t.session = &session_Id
   AND t.sample_time >= to_date('&start_Time','yyyy-MM-dd hh24:mi:ss')
   AND t.sample_time <  to_date('&end_Time','yyyy-MM-dd hh24:mi:ss')
 ORDER BY t.sample_time;

file

2. dba_hist_active_sess_history(保留活动历史会话的采集信息)

dba_hist_active_sess_history 中数据通过快照生成。快照中的记录从v$active_session_history 中抽取,抽取条件是间隔10秒且相同的stample_time记录,并且持久化保存,用做awr报表。

要知道ASH信息最终都是要写入AWR的,v$active_seesion_history 的采样数据的百分之10会被写入磁盘(写入比例由隐藏参数_ash_disk_filter_ratio控制),记录在 AWR 的基础表WRH$ _ACTIVE_SESSION_HISTORY中,其写入频率为ASH buffer写满即写入磁盘,而dba_hist_active_sess_history视图是WRH$_ACTIVE_SESSION_HISTORY视图和其他几个视图的联合展现。

SELECT *
  FROM dba_hist_active_sess_history t
 WHERE t.sample_time >= to_date('&start_Time','yyyy-MM-dd hh24:mi:ss')
   AND t.sample_time <  to_date('&end_Time','yyyy-MM-dd hh24:mi:ss')
   AND t.instance_number = &instance_Id
   AND t.session_id = &session_Id
 ORDER BY t.sample_time;

file

  • 字段
字段 数据类型 空值 描述
SNAP_ID NUMBER NOT NULL 唯一快照ID
DBID NUMBER NOT NULL 快照的数据库ID
INSTANCE_NUMBER NUMBER NOT NULL 快照的实例编号
SAMPLE_ID NUMBER NOT NULL 样本的ID
SAMPLE_TIME TIMESTAMP(3) NOT NULL 样本的时间
SESSION_ID NUMBER NOT NULL 会话标识符
SESSION_SERIAL# NUMBER 会话序列号(用于唯一标识会话的对象)
SESSION_TYPE VARCHAR2(10) 会话类型:FOREGROUND、BACKGROUND
FLAGS NUMBER 保留供将来使用
USER_ID NUMBER Oracle用户标识符
SQL_ID VARCHAR2(13) 当前正在执行的SQL语句的SQL标识符
IS_SQLID_CURRENT VARCHAR2(1) 指示SQL_ID列中的SQL标识符是否正在执行(Y)或不执行(N)
SQL_CHILD_NUMBER NUMBER 当前正在执行的SQL语句的子编号
SQL_OPCODE NUMBER 指示SQL语句的操作阶段
SQL_OPNAME VARCHAR2(64) SQL命令名称
FORCE_MATCHING_SIGNATURE NUMBER CURSOR_SHARING参数设置为时使用的签名FORCE
TOP_LEVEL_SQL_ID VARCHAR2(13) 顶级SQL语句的SQL标识符
TOP_LEVEL_SQL_OPCODE NUMBER 指示顶级SQL语句所处的操作阶段
SQL_PLAN_HASH_VALUE NUMBER 游标的SQL计划的数字表示
SQL_PLAN_LINE_ID NUMBER SQL计划行ID
SQL_PLAN_OPERATION VARCHAR2(64) 计划操作名称
SQL_PLAN_OPTIONS VARCHAR2(64) 计划操作选项
SQL_EXEC_ID NUMBER SQL执行标识符
SQL_EXEC_START DATE SQL执行开始的时间
PLSQL_ENTRY_OBJECT_ID NUMBER 堆栈上最顶层PL / SQL子程序的对象ID(如果堆栈上没有PL / SQL子程序,则为NULL)
PLSQL_ENTRY_SUBPROGRAM_ID NUMBER 堆栈上最顶层PL / SQL子程序的子程序ID(如果堆栈上没有PL / SQL子程序,则为NULL)
PLSQL_OBJECT_ID NUMBER 当前正在执行的PL / SQL子程序的对象ID(如果执行SQL,则为NULL)
PLSQL_SUBPROGRAM_ID NUMBER 当前正在执行的PL / SQL对象的子程序ID(如果执行SQL,则为NULL)
QC_INSTANCE_ID NUMBER 查询协调器实例ID
QC_SESSION_ID NUMBER 查询协调器会话ID
QC_SESSION_SERIAL# NUMBER 查询协调器会话序列号
PX_FLAGS NUMBER 保留供内部使用
EVENT VARCHAR2(64) 如果SESSION_STATE = WAITING,那么会话在采样时等待的事件。如果SESSION_STATE = ON CPU,则此列将为NULL
EVENT_ID NUMBER 会话正在等待或会话最后等待的资源或事件的标识符
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如果当前正在等待)
SESSION_STATE VARCHAR2(7) 会话状态:WAITING、ON CPU
TIME_WAITED NUMBER 当前会话实际花费在等待事件上的时间(以微秒为单位)。此列设置为采样时正在进行的等待。
BLOCKING_SESSION_STATUS VARCHAR2(11) 阻止会话的状态:VALID、NO HOLDER、GLOBAL、NOT IN WAIT、UNKNOWN
BLOCKING_SESSION NUMBER 阻塞会话的会话标识符。仅在会话等待队列或“缓冲区忙”等待时填充。地图到V$SESSION.BLOCKING_SESSION
BLOCKING_SESSION_SERIAL# NUMBER 阻止会话的序列号
BLOCKING_INST_ID NUMBER 显示的阻止程序的实例编号BLOCKING_SESSION
BLOCKING_HANGCHAIN_INFO VARCHAR2(1) 指示有关的信息BLOCKING_SESSION是来自挂起链(Y)还是不来自(N)
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。地图到V$SESSION.ROW_WAIT_BLOCK#
CURRENT_ROW# NUMBER 会话引用的行标识符地图到V$SESSION.ROW_WAIT_ROW#
TOP_LEVEL_CALL# NUMBER Oracle顶级电话号码
TOP_LEVEL_CALL_NAME VARCHAR2(64) Oracle顶级呼叫名称
CONSUMER_GROUP_ID NUMBER 消费者组ID
XID RAW(8) 会话在采样时正在处理的事务ID。V$SESSION不包含此信息。
REMOTE_INSTANCE# NUMBER 远程实例标识符,用于为此会话等待的块提供服务。此信息仅在会话等待群集事件时可用。
TIME_MODEL NUMBER 时间模型信息
IN_CONNECTION_MGMT VARCHAR2(1) 指示会话在采样时是否正在进行连接管理(Y)或不是(N)
IN_PARSE VARCHAR2(1) 指示会话在采样时是否正在解析(Y)或不是(N)
IN_HARD_PARSE VARCHAR2(1) 指示在sampling(Y)或不是(N)时会话是否难以解析
IN_SQL_EXECUTION VARCHAR2(1) 指示会话是否在sampling(Y)或不执行时执行SQL语句(N)
IN_PLSQL_EXECUTION VARCHAR2(1) 指示会话是否在sampling(Y)或不执行时执行PL / SQL (N)
IN_PLSQL_RPC VARCHAR2(1) 指示会话是否在sampling(Y)或不执行时执行入站PL / SQL RPC调用(N)
IN_PLSQL_COMPILATION VARCHAR2(1) 指示会话是在编译时是否正在编译PL / SQL(Y)或不是(N)
IN_JAVA_EXECUTION VARCHAR2(1) 指示会话是否在sampling(Y)或不执行时执行Java (N)
IN_BIND VARCHAR2(1) 指示会话是否在sampling(Y)或不执行时执行绑定操作(N)
IN_CURSOR_CLOSE VARCHAR2(1) 指示会话是否在sampling(Y)或不是(N)时关闭游标
IN_SEQUENCE_LOAD VARCHAR2(1) 指示会话是按顺序加载(按顺序加载代码)(Y)还是不加载(N)
CAPTURE_OVERHEAD VARCHAR2(1) 指示会话是否正在执行捕获代码(Y)或不执行(N)
REPLAY_OVERHEAD VARCHAR2(1) 指示会话是否正在执行重放代码(Y)或不执行(N)
IS_CAPTURED VARCHAR2(1) 指示是否正在捕获会话(Y)或不捕获(N)
IS_REPLAYED VARCHAR2(1) 指示会话是否正在重播(Y)或不重播(N)
SERVICE_HASH NUMBER 标识服务的哈希
PROGRAM VARCHAR2(64) 操作系统程序的名称
MODULE VARCHAR2(48) 由DBMS_APPLICATION_INFO.SET_MODULE过程设置的当前正在执行的模块的名称
ACTION VARCHAR2(32) DBMS_APPLICATION_INFO.SET_ACTION过程设置的当前正在执行的操作的名称
CLIENT_ID VARCHAR2(64) 会话的客户端标识符
MACHINE VARCHAR2(64) 客户端的操作系统机器名称
PORT NUMBER 客户端端口号
ECID VARCHAR2(64) 执行上下文标识符(由Application Server发送)
DBREPLAY_FILE_ID NUMBER 如果正在捕获或重放会话,那么DBREPLAY_FILE_ID是工作负载捕获或工作负载重放的文件ID; 否则它是NULL。
DBREPLAY_CALL_COUNTE NUMBER 如果正在捕获或重放会话,则是正在捕获或重放DBREPLAY_CALL_COUNTER的用户呼叫的呼叫计数器; 否则它是NULL。
TM_DELTA_TIME NUMBER 在其时间间隔(以微秒计)TM_DELTA_CPU_TIME和TM_DELTA_DB_TIME被累积
TM_DELTA_CPU_TIME NUMBER 此会话在过去TM_DELTA_TIME几微秒内花在CPU上的时间
TM_DELTA_DB_TIME NUMBER 此会话在过去TM_DELTA_TIME几微秒内在数据库调用中花费的时间
DELTA_TIME NUMBER 自上次采样或创建会话以来的时间间隔(以微秒为单位),累计接下来的五个统计信息
DELTA_READ_IO_REQUESTS NUMBER 此会话在过去DELTA_TIME几微秒内发出的读取I / O请求数
DELTA_WRITE_IO_REQUESTS NUMBER 此会话在过去DELTA_TIME几微秒内发出的写入I / O请求数
DELTA_READ_IO_BYTES NUMBER 此会话在过去DELTA_TIME几微秒内读取的I / O字节数
DELTA_WRITE_IO_BYTES NUMBER 此会话在过去DELTA_TIME几微秒内写入的I / O字节数
DELTA_INTERCONNECT_IO_BYTES NUMBER 在过去DELTA_TIME几微秒内通过I / O互连发送的I / O字节数
PGA_ALLOCATED NUMBER 此示例拍摄时此会话占用的PGA内存量(以字节为单位)
TEMP_SPACE_ALLOCATED NUMBER 拍摄此样本时此会话消耗的TEMP内存量(以字节为单位)

3. 通过两个视图解决的一些问题

3.1. 查询被阻塞会话试图访问的对象

SELECT DECODE(gs.CURRENT_OBJ#, 0, NULL,
                'SELECT * ' || CHR(13) || '  FROM ' || (SELECT a.object_name FROM dba_objects a WHERE a.object_id = gs.CURRENT_OBJ#) || CHR(13) ||
                ' WHERE ROWID = dbms_rowid.rowid_create(rowid_type => 1, object_number => ' || gs.CURRENT_OBJ# ||
                ', relative_fno => ' ||  gs.CURRENT_FILE# || ', block_number => ' || gs.CURRENT_BLOCK# || ', row_number => ' || gs.CURRENT_ROW# || ');') AS locked_row, gs.*
   FROM gv$active_session_history gs, dba_objects do
  WHERE gs.CURRENT_OBJ# = do.object_id(+)
    AND gs.session_id = &session_Id
    AND gs.sample_time >= to_date('&start_Time','yyyy-MM-dd hh24:mi:ss')
    AND gs.sample_time <  to_date('&end_Time','yyyy-MM-dd hh24:mi:ss')
    AND gs.inst_id = &instance_Id;

file