首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查Oracle数据库中长时间运行的查询

如何检查Oracle数据库中长时间运行的查询
EN

Stack Overflow用户
提问于 2009-03-07 18:43:40
回答 8查看 567.1K关注 0票数 106

我的应用程序使用Oracle数据库,速度变慢或似乎已完全停止。

怎样才能找出哪些查询是最昂贵的,以便我可以进一步调查?

EN

回答 8

Stack Overflow用户

发布于 2009-03-09 05:49:28

它显示了当前处于“活动”状态的SQL:

代码语言:javascript
复制
select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value
and s.status = 'ACTIVE'
and s.username <> 'SYSTEM'
order by s.sid,t.piece
/

这显示了锁。有时事情会变慢,但这是因为它在等待锁时被阻塞了:

代码语言:javascript
复制
select
  object_name, 
  object_type, 
  session_id, 
  type,         -- Type or system/user lock
  lmode,        -- lock mode in which session holds lock
  request, 
  block, 
  ctime         -- Time since current mode was granted
from
  v$locked_object, all_objects, v$lock
where
  v$locked_object.object_id = all_objects.object_id AND
  v$lock.id1 = all_objects.object_id AND
  v$lock.sid = v$locked_object.session_id
order by
  session_id, ctime desc, object_name
/

这是一个很好的查找长操作(例如全表扫描)的方法。如果是因为大量的短操作,什么都不会显示出来。

代码语言:javascript
复制
COLUMN percent FORMAT 999.99 

SELECT sid, to_char(start_time,'hh24:mi:ss') stime, 
message,( sofar/totalwork)* 100 percent 
FROM v$session_longops
WHERE sofar/totalwork < 1
/
票数 147
EN

Stack Overflow用户

发布于 2009-03-07 19:03:25

试一试,它会给你当前运行超过60秒的查询。请注意,如果SQL有多行,它会在每个运行的查询中打印多行。看看sid和serial#,看看什么属于一起。

代码语言:javascript
复制
select s.username,s.sid,s.serial#,s.last_call_et/60 mins_running,q.sql_text from v$session s 
join v$sqltext_with_newlines q
on s.sql_address = q.address
 where status='ACTIVE'
and type <>'BACKGROUND'
and last_call_et> 60
order by sid,serial#,q.piece
票数 40
EN

Stack Overflow用户

发布于 2009-03-07 21:44:29

v$session_longops

如果您查找的是for != totalwork,您将看到尚未完成的条目,但是当操作完成时,这些条目不会被删除,因此您也可以在那里看到许多历史记录。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/622289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档