您的位置:首页 > 数据库

查找正在运行的sql语句及该语句运行的时间

2011-03-15 13:11 453 查看
查询正在运行的sql语句:

SQL> select address,sql_text,piece from v$session,v$sqltext where address=sql_address order by address,piece

从网上摘下:

$session中的last_call_et列表示从STATUS(状态)改变到当前的时间(单位是秒)。

也就是说,如果session当前是inactive的,则表示inactive的时间

如果session当前是active的,则表示active的时间。

另外需要注意的是last_call_et表示的是last call的时间。

对于单条SQL而言,是指sql执行时间;对于plsql而言,则是指整个plsql的执行时间。

后台进程一直是active的,因此后台进程的last_call_et与实例运行时间相近。

查找方法:

SQL> select sid,serial#,username,status,last_call_et from v$session where status

='ACTIVE' and username is not null order by last_call_et desc;

SID SERIAL# USERNAME STATUS LAST_CALL_ET

---------- ---------- ---------- -------- ------------

128 168 SCOTT ACTIVE 3025

130 136 SYS ACTIVE 1236

125 1 DBSNMP ACTIVE 3

137 527 SYS ACTIVE 0

再根据SID找出执行的SQL或PL/SQL:

select sql_text from v$session a,v$sqltext_with_newlines b

where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value

and a.sid=&sid order by piece;

SQL> l

1 select sid,serial#,username,machine,last_call_et,status from v$session

2 where status='INACTIVE' and username is not null

3* order by last_call_et

SQL> select sql_text from v$session a,v$sqltext_with_newlines b

2 where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash

_value

3 and a.sid=&sid order by piece;

输入 sid 的值: 128

原值 3: and a.sid=&sid order by piece

新值 3: and a.sid=128 order by piece

SQL_TEXT

----------------------------------------------------------------

insert into test

select * from test

可以看到上面的语句已经运行了3025秒,相当于50分钟.

如果改语句不重要,可以kill掉

SQL> alter system kill session '128,168';

系统已更改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: