Oracle-估算运行时间长的耗时操作语句

SELECT INST_ID,
	USERNAME,
	SID,
	SERIAL#,
	OPNAME,
	ROUND(SOFAR * 100 / TOTALWORK, 0) || '%' AS PROGRESS,
	SOFAR,
	TOTALWORK,
	TIME_REMAINING,
	SQL_ID
  FROM GV$SESSION_LONGOPS
 WHERE TIME_REMAINING <> 0
;

SELECT  SID,  decode(totalwork, 0, 0, round(100 * sofar/totalwork, 2)) "Percent", message "Message", start_time, 
elapsed_seconds, time_remaining , inst_id 
from GV$Session_longops t 
where t.TARGET='XXX' and t.sid = 88
 order by t.start_time desc;

V$SESSION_LONGOPS视图记录了执行时间长于6秒的某个操作(可能是备份,恢复,收集统计信息,Hash Join,Sort ,Nested loop,Table Scan, Index Scan 等等),通常使用该视图用来分析SQL运行缓慢的原因,可以配合V$SESSION视图。

注意:必须满足以下2个条件

  1. 必须将初始化参数 timed_statistics 设置为true或者开启sql_trace
  2. 必须用ANALYZE或者DBMS_STATS对对象收集过统计信息

视图字段说明:

字段 说明
SID Session标识
SERIAL# Session串号
OPNAME 操作简要说明
TARGET 操作运行所在的对象
TARGET_DESC 目标对象说明
SOFAR 至今为止完成的工作量
TOTALWORK 总工作量
UNITS 工作量单位
START_TIME 操作开始时间
LAST_UPDATE_TIME 统计项最后更新时间
TIMESTAMP 操作的时间戳
TIME_REMAINING 预计完成操作的剩余时间(秒)
ELAPSED_SECONDS 从操作开始总花费时间(秒)
CONTEXT 前后关系
MESSAGE 统计项的完整描述
USERNAME 执行操作的用户ID
SQL_ADDRESS 关联v$sql
SQL_HASH_VALUE 关联v$sql
SQL_ID 关联v$sql
QCSID 主要是并行查询一起使用