【问题标题】:Use gv$session to tell if a query is hanging使用 gv$session 判断查询是否挂起
【发布时间】:2013-12-13 14:11:30
【问题描述】:

我有一个在 Oracle 中运行的查询,它可能会或可能不会挂起。它现在已经运行了大约 10 个小时,但根据我加载的数据量,这可能不是不合理的。

我正在查看 gv$session 中的会话,并想知道是否有办法转换该信息以查看是否真的有任何活动在进行,或者查询是否卡在等待锁定或以其他方式挂起。

我已经阅读了此视图的文档here。我主要是从任何有在 Oracle 中调试此类问题的经验的人那里寻找提示。

谢谢!

【问题讨论】:

  • v$session_longops 中是否有条目,您可以检查它是否在进行中?或者查看此链接以了解您的会话是否被阻止的方法:orafaq.com/node/854
  • 谢谢,我可以把它和 gv$sqlarea 结合起来看看是什么语句阻碍了我!

标签: oracle oracle10g


【解决方案1】:

gv$session 中,event 列告诉您会话当前正在等待什么等待事件。如果您的会话正在等待另一个会话持有的某种锁,event 会告诉您(例如,如果您排队等待锁定由另一个会话)和blocking_instanceblocking_session 将填充锁持有者的实例和会话ID。您还可以查看seconds_in_wait(如果wait_time=0)来确定会话在当前等待事件中花费了多少秒。这至少应该告诉您您的会话当前是否“卡住”,但它不会告诉您您的查询是否真的会完成——如果有一个糟糕的计划,那么您完全有可能得到“好”等待磁盘 I/O 等事件表明会话正在执行某些操作,但查询永远不会真正完成。

【讨论】:

  • select 'ALTER SYSTEM KILL SESSION '''||sid||','||"SERIAL#"||''';', event from gv$session where machine = '你的机器' 很容易生成命令来杀死它们。只需复制粘贴第 1 列
【解决方案2】:

根据一些进一步的研究和 Ollie 的评论,我想出了这些有助于调试问题的查询:

select s.sid, 
       s.username,
       s.machine,
       s.osuser, 
       cpu_time,
       (elapsed_time/1000000)/60 as minutes,
       sql_text
from gv$sqlarea a, gv$session s
where s.sql_id = a.sql_id
and s.machine like '####';


select lo.*, 
       a.sql_text
from gv$sqlarea a, gv$session_longops lo
where lo.sql_id = a.sql_id
and lo.sid = ####
order by lo.start_time;

【讨论】:

  • 如果不检查这些视图中的确切列,通过 SQL_ID 将 gv$sqlarea 链接到 gv$session_longops 不是更好吗?我现在不在我的电脑前,所以我无法检查:-(
【解决方案3】:

这将有助于检查当前正在运行的会话

select a.SID, a.SERIAL#, c.OBJECT_NAME 
from v$session a, v$locked_object b, user_objects c
where a.SID=b.SESSION_ID and b.OBJECT_ID=c.OBJECT_ID

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多