小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
用户查询 Oracle 数据库的数据时,是通过监听连接到数据库主机,每一个连接都会在主机端生成一个进程。
有时候,数据库主机会 hang 住或者负载很高,此时可以通过 top 命令来查看进行的资源使用情况,如果某一个oracle 用户进程的资源使用很高,那么就可以通过系统的 SPID 来查看对应的session以及SQL 信息,快速定位以及排查问题!
以下分享查询的SQL语句:
set linesize 260
set pagesize 1000
col sid for 99999
col spid for a8
col event for a30
col module for a35
col machine for a15
col username for a10
col holder for a10
col final for a10
col sql_id for a15
col exec_gets for 99999999
col seconds for a5
col object_id for 999999
col param for a30
col sql_text for a6
col PGA_USE for 9999
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select a.sid,
a.username,
a.machine,
a.module,
a.event,
a.sql_id,
round(decode(c.executions,0,buffer_gets,buffer_gets/executions)) exec_gets,
a.ROW_WAIT_OBJ# object_id,
a.BLOCKING_INSTANCE||'_'||a.blocking_session holder,
a.FINAL_BLOCKING_INSTANCE||'_'||a.FINAL_BLOCKING_SESSION final,
to_char(LAST_CALL_ET) seconds,
a.p1 || '_' || a.p2 || '_' || a.p3 param,
b.spid,
trunc(b.PGA_USED_MEM / 1024 / 1024,2) as PGA_USE,
substr(c.sql_text,0,6) sql_text
from v$session a, v$process b,v$sql c
where a.paddr = b.addr(+)
and a.status = 'ACTIVE'
and not (a.type = 'BACKGROUND' and a.state = 'WAITING' and
a.wait_class = 'Idle')
and a.sql_id=c.sql_id(+)
and a.sql_child_number=c.CHILD_NUMBER(+)
and b.spid='&SPID'
order by a.sql_id, a.machine;
📢 注意:查询条件,需要输入 SPID !
本次分享到此结束啦~
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。
❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️