v$active_session_history
内容反应了SGA中ASH buffer。Oracle每一秒写入一次ASH buffer。在查询时,一般按照sample_time 排序。v$session针对当前的会话(session),而这两个视图保存了历史信息。当一条SQL已经完成,断开会话时,这两个视图就很有用。
例子:
SELECT * FROM dba_hist_active_sess_history
where session_id = (select sid from v$mystat where rownum =1)
order by sample_time;
ASH buffer空间有限,Oracle会将其内容持久化到dba_hist_active_sess_history。dba_hist_active_sess_history的列多了snap_id, dbid, instance_number,其他完全一致。
精确定位SQL
- session_id
- Session_serial#
- user_id
- sql_id
- Sql_child_number
sql_id, sql_child_number, sql_plan_hash_value,可以找到对应的执行计划。
并发
根据如下信息可以找到某slave的QC
- qc_instance_id
- qc_session_id
- qc_session_serial#
会话(Session)状态
Session_state: Waiting | On CPU
阻塞
所有Blocking_xxx 列包含阻塞的会话信息
性能相关
DELTA_TIME: 一个时间间隔,以下五列的统计数据是在这个时间间隔内累计的
delta_read_io_requests
delta_write_io_requests
delta_read_io_bytes
delta_write_io_bytes
delta_interconnect_io_bytes
pga_allocated: 取样时分配的PGA
temp_space_allocated:取样时分配的temp
下面的SQL取得某SQL消耗的最大PGA, Temp,及其使用的用户名,客户端机器名等
with sql_space AS (select
sql_id,
round(max(pga_allocated)/(1024*1024),2) pga_mb,
round(max(temp_space_allocated)/(1024*1024),2) temp_mb
from dba_hist_active_sess_history
where session_type='FOREGROUND'
group by sql_id
)
select ash.session_id,au.username, ash.machine, ash.program, ss.pga_mb, ss.temp_mb
from dba_hist_active_sess_history ash, sql_space ss, all_users au
where ss.sql_id=ash.sql_id
and ash.user_id=au.user_id
order by ss.temp_mb;
V$SQLSTATS
存储了SQL统计信息。即使SQL已经被移出Shared Pool, 其统计信息仍然保存在该视图中。
在这些视图中,常见:
SQL_ID: SQL Statement的SQL_ID, 是对SQL内容做Hash得到的。
Child Cursor: 字面一致的SQL,语义可能不一样。如scott, hr都执行一条语句: select * from emp(假设各自schema下都有这个表),实际上这条SQL的含义是不一样的。这时就有两个Child Cursor。
Parent Cursor: Cursor number =0 的Child Cursor, 特殊的Child Cursor.
SQL Hash Value: 存在是为了兼容性,可以被SQL_ID替代。
Execution Plan Hash: dbms_xplan.display_cursor可以得到。是执行计划的Hash。