SQL执行计划及统计信息相关视图

时间:2022-01-14 03:55:39

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。