ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 动态视图V$SESSION_LONGOPS学习

动态视图V$SESSION_LONGOPS学习

原创 Linux操作系统 作者:lwitpub 时间:2011-02-25 11:18:54 0 删除 编辑
For v$session_longops, it exists in the  lock  part of oracle directory.
本视图显示运行超过6秒的操作的状态。包括备份,恢复,统计信息收集,查询等等.
主要列说明:
l        SID:Session标识
l        SERIAL#:Session串号
l        OPNAME:操作简要说明
l        TARGET:操作运行所在的对象
l        TARGET_DESC:目标对象说明
l        SOFAR:至今为止完成的工作量
l        TOTALWORK:总工作量
l        UNITS:工作量单位
l        START_TIME:操作开始时间
l        LAST_UPDATE_TIME:统计项最后更新时间
l        TIME_REMAINING:预计完成操作的剩余时间(秒)
l        ELAPSED_SECONDS:从操作开始总花费时间(秒)
l        MESSAGE:统计项的完整描述
l        USERNAME:执行操作的用户ID
l        SQL_HASH_VALUE:用于连接查询的列
一、什么情况下,操作信息会出现在V$SESSION_LONGOPS
同时满足以下几个条件,操作信息才会出现在V$SESSION_LONGOPS中。
1、操作是以下几种操作之一
# Table scan;
# Index Fast Full Scan;
# Hash join;
# Sort/Merge;
# Sort Output;
# Rollback;
# Gather Table's Index Statistics
不同的版本下V$SESSION_LONGOPS记录的操作可能会不一样。
2、操作时间大于6秒
3、读取的block数目大于一定量
1)如果是TABLE FULL SCAN,读取的block数目至少大于10000
2)如果是Index Fast Full Scan,读取的block数目至少大于1000
3)其他操作读取block的数目不明

二、如何监控耗时长的操作
会话一:发出查询
----创建一个临时表
SQL>set timing on;
SQL>create table ttt as select level lv,rownum rn from dual connect by level<10000000;
Table created.
Elapsed: 00:00:19.95
SQL>set autot traceonly
----执行超过6秒的查询
SQL>select * from gary.ttt;
9999999 rows selected.
Elapsed: 00:02:10.77
Execution Plan
----------------------------------------------------------
Plan hash value: 774701505
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    11M|   296M|  5640  (10)| 00:01:08 |
|   1 |  TABLE ACCESS FULL| TTT  |    11M|   296M|  5640  (10)| 00:01:08 |
--------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement

Statistics
----------------------------------------------------------
          4  recursive calls
          0  db block gets
     689537  consistent gets
      13693  physical reads
          0  redo size
  214444903  bytes sent via SQL*Net to client
    7333722  bytes received via SQL*Net from client
     666668  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    9999999  rows processed
会话二:在会话1执行一段时间(大于6s)后,再查询V$SESSION_LONGOPS视图
SQL>set linesize 300
SQL>col opname for a20
SQL>col pct_work for a20
SQL>col sql_text for a30
SQL>SELECT SE.SID,OPNAME,TRUNC(SOFAR / TOTALWORK * 100, 2) || '%' AS PCT_WORK,ELAPSED_SECONDS ELAPSED,ROUND(ELAPSED_SECONDS * (TOTALWORK - SOFAR) / SOFAR) REMAIN_TIME, SQL_TEXT FROM V$SESSION_LONGOPS SL, V$SQLAREA SA, V$SESSION SE WHERE SL.SQL_HASH_VALUE = SA.HASH_VALUE AND SL.SID = SE.SID AND SOFAR != TOTALWORK ORDER BY START_TIME;
  SID OPNAME               PCT_WORK     ELAPSED REMAIN_TIME SQL_TEXT
---------- -------------------- -------------------- ---------- ----------- ------------------------------
       156 Table Scan           42.34%                      57           78 select * from gary.ttt
SQL>/
SID OPNAME               PCT_WORK      ELAPSED REMAIN_TIME SQL_TEXT
---------- -------------------- -------------------- ---------- ----------- ------------------------------
       156 Table Scan           58.31%                       78          56 select * from gary.ttt
SQL>/
 SID OPNAME               PCT_WORK      ELAPSED REMAIN_TIME SQL_TEXT
---------- -------------------- -------------------- ---------- ----------- ------------------------------
       156 Table Scan           89.77%                      118          13 select * from gary.ttt
SQL>/
  SID OPNAME               PCT_WORK     ELAPSED REMAIN_TIME SQL_TEXT
---------- -------------------- -------------------- ---------- ----------- ------------------------------
       156 Table Scan           98.92%                      130           1 select * from gary.ttt
可以看到:
会话1的真实执行时间:02:10.77=130.77s
会话2从V$SESSION_LONGOPS的最终估算时间:130 + 1 = 131s
可以看到,开始执行时间和估算的有误差,但最终时间基本上是正确的。
在实际中,你可能通过这个查询估算到某个SQL执行的剩余时间很短了,但实际上操作过了很久才结束。
这是因为V$SESSION_LONGOPS只记录部分操作的信息,但是一个SQL可能会包含很多个操作步骤,V$SESSION_LONGOPS记录的只是这个SQL要执行众多操作的一步。

另外,此视图也可以用来监视比如RMAN备份的时间进度
SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,ROUND(SOFAR/TOTALWORK*100,2) "% COMPLETED" FROM V$SESSION_LONGOPS WHERE OPNAME LIKE 'RMAN%' AND OPNAME NOT LIKE '%aggregate%'  AND TOTALWORK != 0 AND SOFAR <> TOTALWORK;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/628922/viewspace-687924/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 关于oracle的ORA-600
请登录后发表评论 登录
全部评论

注册时间:2009-05-08

  • 博文量
    107
  • 访问量
    394348