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;
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;
- 字段
字段 | 数据类型 | 空值 | 描述 |
---|---|---|---|
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;