Oracle动态性能表-(11)-V$SESSION_LONGOPS

来源:互联网 发布:人工智能知乎 编辑:程序博客网 时间:2024/05/23 02:00

本视图显示运行超过6秒的操作的状态。包括备份,恢复,统计信息收集,查询等等。
要监控查询执行进展状况,你必须使用cost-based优化方式,并且:
l         设置TIMED_STATISTICS或SQL_TRACE参数值为true。
l         通过ANALYZE或DBMS_STATS数据包收集对象统计信息。
你可以通过DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS过程添加application-specific长运行操作信息到本视图。关于DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS的更多信息可以浏览:Oracle Supplied PL/SQL Packages and Types Reference。
V$SESSION_LONGOPS列说明
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         CONTEXT:前后关系
l         MESSAGE:统计项的完整描述
l         USERNAME:执行操作的用户ID
l         SQL_ADDRESS:用于连接查询的列
l         SQL_HASH_VALUE:用于连接查询的列
l         QCSID:
示例:
找一较大表,确认该表查询将超过6秒,哎呀让它快咱没把握,让它慢这可是我的强项啊~~
SQL> set timing on
SQL> create table ttt as select level lv,rownum rn from dual connect by level<10000000;   --创建一个临时表
Table created
Executed in 19.5 seconds
SQL> commit;
Commit complete
Executed in 0 seconds
SQL> select * from (select * from ttt order by lv desc) where rownum<2;    --执行一个费时的查询
        LV         RN
---------- ----------
   9999999    9999999
Executed in 9.766 seconds   --哈哈,成功超过6秒
SQL> select sid,opname,sofar,totalwork,units,sql_hash_value from v$session_longops;      ----看看v$session_longops中是不是已经有记录了
       SID OPNAME                                                                SOFAR TOTALWORK UNITS                            SQL_HASH_VALUE
---------- ---------------------------------------------------------------- ---------- ---------- -------------------------------- --------------
        10 Table Scan                                                            47276      47276 Blocks                               2583310173
Executed in 0.047 seconds
SQL> select a.sql_text from v$sqlarea a,v$session_longops b where a.HASH_VALUE=b.SQL_HASH_VALUE;   --通过hash_value联系查询出刚执行的查询语句。
SQL_TEXT
--------------------------------------------------------------------------------
select * from (select * from ttt order by lv desc) where rownum<2
Executed in 0.063 seconds


这个视图的来源大致是这样的:

SELECT inst_id, ksulosno, ksulosrn, ksulopna, ksulotna, ksulotde, ksulosfr,
       ksulotot, ksulouni,
       TO_DATE (ksulostm, 'MM/DD/RR HH24:MI:SS', 'NLS_CALENDAR=Gregorian'),
       TO_DATE (ksulolut, 'MM/DD/RR HH24:MI:SS', 'NLS_CALENDAR=Gregorian'),
       DECODE (SIGN (ksulotot - ksulosfr),
               -1, TO_NUMBER (NULL),
               DECODE (ksulosfr,
                       0, TO_NUMBER (NULL),
                       ROUND (ksuloetm * ((ksulotot - ksulosfr) / ksulosfr))
                      )
              ),
       ksuloetm, ksuloctx, ksulomsg, ksulounm, ksulosql, ksulosqh, ksuloqid
  FROM x$ksulop;

补充信息: 一篇非常好的解释文档。有些内容我之前也不知道。

X$ksulop, kernel service, user long operation. V$Session_LONGOPS 这个视图将显示超过六秒钟的操作。
前提条件: 1) Oracle优化器使用 CBO; 2) 数据对象已经收集了统计信息; 3) 初始化参数 TIMED_STATISTICS 或是 SQL_TRACE parameter 设定为 TRUE 例子:

 SELECT opname, time_remaining, elapsed_seconds, MESSAGE
  FROM v$session_longops
 WHERE time_remaining > 0;


 
原创粉丝点击