v$session_longops 查看进程的进度

来源:互联网 发布:php notice 关闭 编辑:程序博客网 时间:2024/06/11 02:28

http://cc59.itpub.net/post/1845/286133

DBA们经常需要监控数据库中一些花费大量时间的操作,如备份恢复,收集统计信息,排序都会记录在这个视图当中。

这个视图主要是显示运行时间超过6秒的数据库操作的状态.所以对于数据库监控一些耗时的操作是非常有意义的。
并且可以看到某个进程的执行进度。
来看看这个视图的结构:
SQL> desc v$session_longops
名称 是否为空? 类型
----------------------------------------- -------- ----------------

SID NUMBER
SERIAL# NUMBER
OPNAME VARCHAR2(64)
TARGET VARCHAR2(64)
TARGET_DESC VARCHAR2(32)
SOFAR NUMBER
TOTALWORK NUMBER
UNITS VARCHAR2(32)
START_TIME DATE
LAST_UPDATE_TIME DATE
TIME_REMAINING NUMBER
ELAPSED_SECONDS NUMBER
CONTEXT NUMBER
MESSAGE VARCHAR2(512)
USERNAME VARCHAR2(30)
SQL_ADDRESS RAW(4)
SQL_HASH_VALUE NUMBER
QCSID NUMBER


其中SID和SERIAL#是与v$session中的匹配的,
OPNAME:指长时间执行的操作名.如:Table Scan
TARGET:被操作的object_name. 如:tableA
TARGET_DESC:描述target的内容
SOFAR:这个是需要着重去关注的,表示已要完成的工作数,如扫描了多少个块。
TOTALWORK:指目标对象一共有多少数量(预计)。如块的数量。
UNITS:
START_TIME:进程的开始时间
LAST_UPDATE_TIM:最后一次调用set_session_longops的时间
TIME_REMAINING: 估计还需要多少时间完成,单位为秒
ELAPSED_SECONDS:指从开始操作时间到最后更新时间
CONTEXT:
MESSAGE:对于操作的完整描述,包括进度和操作内容。
USERNAME:与v$session中的一样。
SQL_ADDRESS:关联v$sql
SQL_HASH_VALUE:关联v$sql
QCSID:主要是并行查询一起使用。

SQL> conn aa/admin
已连接。
SQL> insert into test select * from test ;

已创建898432行


打开另一个会话,可使用以下脚本来观察之前那个会话所作的操作的执行状态.

SQL> select b.*
2 from v$session a, v$session_longops b
3 where a.sid=b.sid
4 and a.serial#=b.serial#
5 /

SID SERIAL# OPNAME TARGET SOFAR TOTALWORK UNITS START_TIME LAST_UPDATE_TIME TIME_REMAINING ELAPSED_SECONDS CONTEXT MESSAGE
---- ---------- -------------- --------- ------ ---------- -------- ----------- ---------------- -------------- --------------- ---------- -----------------------------------------------------
10 74 Table Scan AA.TEST 6623 12389 Blocks 2007-5-7 2: 2007-5-7 2:52:03 30 34 0 Table Scan: AA.TEST: 6623 out of 12389 Blocks done

SQL>

可以看到现在是在对aa.test作表扫描。预计有12389个blocks,已然完成了6623个,已经使用了34秒,大概还需要30秒可以完成。

可以看出大概195块/秒的速度来扫描表。




http://blog.csdn.net/robinson1988/article/details/5537024


V$SESSION_LONGOPS视图记录了执行时间长于6秒的某个操作(这些操作可能是备份,恢复,Hash Join,Sort ,Nested loop,Table Scan, Index Scan 等等)。

要想V$SESSION_LONGOPS视图中有记录

1.必须将初始化参数 timed_statistics设置为true或者开启sql_trace

2.必须用ANALYZE或者DBMS_STATS对对象收集过统计信息

要理解的就是:比如某个SQL语句执行时间比较长,但是每个操作都没有超过6秒钟,那么你在V$SESSION_LONGOPS这个视图中就无法查询到该信息。还有一点就是,即使某个操作完成了,你在该视图中也可能查询到该操作依然记录在视图中。

这个视图通常用来分析SQL运行缓慢的原因,配合V$SESSION视图。

下面的查询显示未完成操作的信息

col start_time format a20

col last_update_time a30

select sid,message, start_time,last_update_time,time_remaining,

elapsed_seconds from V$SESSION_LONGOPS where time_remaining>0;

如果是RAC:

col start_time format a20

col last_update_time a30

select inst_id,sid,message, start_time,last_update_time,time_remaining,

elapsed_seconds from GV$SESSION_LONGOPS where time_remaining>0;


0 0
原创粉丝点击