监控运行时间较长的sql语句

本文介绍如何使用Oracle数据库的v$session_longops视图来监控长时间运行的SQL查询。通过该视图可以获取查询的进度信息,包括已完成的工作量、总工作量及剩余时间等,从而估算查询完成的时间。
如果发现有一条sql语句执行了很长的时间,可以监控它的处理过程,并查明它何时能执行完成。
通过在v$session_longops数据字典视图中,查看运行时间很长的查询信息,可以估算出查询完成的时间。
来看看这个视图的结构:
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> 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 2015-9-7 2: 2015-9-7 2:52:03 30 34 0 Table Scan: AA.TEST: 6623 out of 12389 Blocks done 


也可以利用这个语句:
select username,target,sofar blocks_read,totalwork total_blocks,
round(time_remaining/60) minutes from v$session_longops  where sofar <> totalwork and username = '';
要想通过v$session_longops监控一个查询,需要满足以下条件。
1)查询必须至少运行六秒钟以上
2)所访问表的数据块数必须大于10000块
3)必须设置了time_statistics或者打开了sql_trace
4)查询中的对象必须已经通过dbms_stats或者analyze进行分析
v$session_longops视图中包含了select语句,dml语句,ddl语句等信息。

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

转载于:http://blog.itpub.net/30430420/viewspace-1805674/

<think> 首先,用户的问题是:“我想查找获取当前执行时间较长SQL语句的方法 请问获取当前执行时间较长SQL语句的方法”。这是一个关于Oracle数据库的问题,用户想了解如何获取当前执行时间较长SQL语句。 现在,系统级指令要求: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 - 用户可见层要求回答结构清晰。 用户提供了三个引用: - 引用[1]:关于设置SQL执行时间统计和查询执行时间较长SQL。 - 引用[2]:多个查询执行时间较长或执行次数最多的SQL语句的示例。 - 引用[3]:另一个查询执行时间较长SQL语句的方法。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是用户的第一个问题,没有上一次问题。所以,我需要基于当前问题回答。 我的回答应该基于这些引用,但用户说这些不是真正的需求,而是参考。所以,我需要提取关键信息来回答用户的问题。 关键问题:获取当前执行时间较长SQL语句的方法。 从引用中: - 引用[1]:使用`set timing on;` 和查询 `v$session_longops`。 - 引用[2]:查询 `v$sqlarea` 基于执行时间和执行次数。 - 引用[3]:查询 `v$session` 和 `v$sqlarea` 基于 `last_call_et`。 所以,我可以综合这些方法来提供一个清晰的步骤。 回答结构: 1. **介绍方法**:解释如何获取当前执行时间较长SQL语句。 2. **提供步骤**:给出具体的SQL查询示例。 3. **解释输出**:帮助用户理解结果。 4. **添加引用标识**:在引用末尾添加[^1], [^2], [^3]。 5. **生成相关问题**:在最后添加相关问题。 由于用户要求使用中文回答,所有内容用中文。 现在,构建回答: - **开头**:简要介绍问题和方法。 - **步骤**: - 方法1:查询 `v$session_longops`(来自引用[1])。 - 方法2:查询 `v$sqlarea` 基于执行时间(来自引用[2])。 - 方法3:查询 `v$session` 基于 `last_call_et`(来自引用[3])。 - **结束**:总结建议。 - **相关问题**:生成几个相关问题。 确保LaTeX格式:由于没有数学表达式,我可以注意行内变量如 `$v$session` 但用户引用中有 `v$sqlarea`,在LaTeX中可能需要处理 `$`,但在回答中,我应该直接使用代码块或正常文本。 系统指令要求行内数学表达式用$...$,但SQL代码不是数学表达式,所以可能不需要。在引用中,有像 `v$sqlarea` 这样的变量,在LaTeX中 `$` 会被解析,所以可能需要转义或避免。但在回答中,我将使用代码块来展示SQL查询,以避免问题。 在回答中: - 使用代码块来展示SQL查询。 - 在文本中,变量如 `v$session` 可以正常写。 - 添加引用标识:例如,在描述方法时,说“如引用[1]所示”[^1]。 生成相关问题: - 例如: 1. 如何优化执行时间较长SQL语句? 2. Oracle中如何监控SQL性能? 3. 什么是 `v$session_longops` 视图的作用? 最终回答结构: 1. 介绍获取当前执行时间较长SQL语句的常见方法。 2. 详细步骤和SQL查询示例。 3. 解释如何解读结果。 4. 添加引用。 5. 相关问题。 </think> ### 获取当前执行时间较长SQL语句的方法 在Oracle数据库中,获取当前执行时间较长SQL语句是性能调优的关键步骤。以下是几种可靠的方法,基于系统视图(如 `v$session`、`v$sqlarea` 和 `v$session_longops`)。我会逐步说明操作步骤和示例查询,帮助您快速定位问题SQL。 #### 方法1:查询 `v$session_longops` 视图(监控长时间运行的操作) `v$session_longops` 视图专门用于跟踪执行时间超过6秒的操作(如全表扫描、索引重建)。以下是查询当前长时间运行SQL的步骤: 1. **开启SQL执行时间统计**(可选,便于后续分析): ```sql SET TIMING ON; -- 启用时间统计,会显示每条SQL的执行耗时 ``` 2. **执行查询**: 此查询筛选出当前仍在运行且剩余时间大于0的操作,并关联SQL文本[^1]: ```sql SELECT a.sid, b.sql_text FROM v$session a, v$sqlarea b WHERE a.sql_hash_value = b.hash_value AND a.sid IN (SELECT sid FROM gv$session_longops WHERE time_remaining > 0); ``` **输出解读**: - `sid`:会话ID,可用于后续终止或监控。 - `sql_text`:SQL语句文本,帮助识别耗时操作。 此方法适合实时监控,但仅捕获特定类型的长时间操作(如备份、大查询)[^1]。 #### 方法2:查询 `v$sqlarea` 视图(基于历史执行时间分析) `v$sqlarea` 存储所有SQL的执行统计信息。通过排序平均执行时间或总耗时,找出最耗资源的SQL[^2]: ```sql SELECT * FROM ( SELECT sa.SQL_TEXT, sa.EXECUTIONS AS "执行次数", ROUND(sa.ELAPSED_TIME / 1000000, 2) AS "总执行时间(秒)", ROUND(sa.ELAPSED_TIME / 1000000 / NULLIF(sa.EXECUTIONS, 0), 2) AS "平均执行时间(秒)", u.username AS "用户名" FROM v$sqlarea sa LEFT JOIN all_users u ON sa.PARSING_USER_ID = u.user_id WHERE sa.EXECUTIONS > 0 ORDER BY "平均执行时间(秒)" DESC ) WHERE ROWNUM <= 50; -- 限制输出前50条 ``` **关键字段说明**: - `平均执行时间(秒)`:值越大表示SQL效率越低。 - `总执行时间(秒)`:累计耗时,帮助识别高频低效SQL。 此方法适合分析历史性能问题,但需注意:高平均时间可能表示单次执行慢,高总时间可能表示频繁调用[^2]。 #### 方法3:查询 `v$session` 视图(实时监控活动会话) 结合 `v$session` 和 `v$sqlarea`,可捕获当前活动会话中耗时较长SQL。`last_call_et` 字段表示会话最后一次操作的持续时间(单位:秒)[^3]: ```sql SELECT s.sid || ',' || s.serial# AS sid_serial, s.username AS "用户名", s.last_call_et AS "持续时间(秒)", s.status AS "状态", sa.SQL_FULLTEXT AS "SQL全文" FROM v$session s JOIN v$process p ON s.paddr = p.addr LEFT JOIN v$sqlarea sa ON s.sql_hash_value = sa.hash_value WHERE s.status = 'ACTIVE' -- 仅过滤活动会话 AND s.username IS NOT NULL -- 排除后台进程 ORDER BY s.last_call_et DESC; -- 按持续时间降序排序 ``` **输出分析**: - `持续时间(秒)`:超过60秒通常视为“长事务”,需优先优化。 - `状态`:`ACTIVE` 表示SQL正在运行。 此方法实时性强,但需定期执行以捕获瞬时问题[^3]。 #### 建议与实践步骤 1. **初步诊断**:使用方法3(`v$session`)快速定位当前活动长事务。 2. **深度分析**:对可疑SQL使用方法2(`v$sqlarea`)检查历史执行情况。 3. **调优工具**:结合 `EXPLAIN PLAN` 分析SQL执行计划。 **注意**: - 所有查询需要 `SELECT` 权限,建议在DBA账户下运行。 - 对于云数据库(如Oracle Cloud),部分视图可能受限,可改用 `DBA_HIST_SQLSTAT` 分析AWR报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值