Oracle 查询阻塞

当Oracle SQL或系统运行缓慢甚至挂起时,可能由session间的阻塞引起。本文介绍如何通过SQL查询检测阻塞情况,助你优化数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- Start

如果你的 SQL 或系统突然 hang 了,很有可能是因为一个 session 阻塞了另一个 session,如何查询是否发生阻塞了呢?看看下面的 SQL吧。

select 
	blocksession.sid        as block_session_sid,
	blocksession.serial#    as block_session_serial#,
	blocksession.username   as block_session_username,
	blocksession.osuser     as block_session_osuser,
	blocksession.machine    as block_session_machine,
	blocksession.status     as block_session_status,
	blockobject.object_name as blocked_table,
	waitsession.sid         as wait_session_sid,
	waitsession.serial#     as wait_session_serial#,
	waitsession.username    as wait_session_username,
	waitsession.osuser      as wait_session_osuser,
	waitsession.machine     as wait_session_machine,
	waitsession.status      as wait_session_status
from 
	v$lock          blocklock,
	v$lock          waitlock,
	v$session       blocksession,
	v$session       waitsession,
	v$locked_object lockedobject,
	dba_objects     blockobject
where 
	blocklock.block    = 1
	and blocklock.sid != waitlock.sid
	and blocklock.id1 = waitlock.id1
	and blocklock.id2 = waitlock.id2
	and blocklock.sid = blocksession.sid
	and waitlock.sid  = waitsession.sid
	and lockedobject.session_id = blocksession.sid
	and lockedobject.object_id  = blockobject.object_id;

如果上面的语句返回了结果,表明发生了阻塞,这个时候你可以把使用 blocksession 的程序停掉。如果还是不能解决问题,那只能让 DBA 帮你把 blocksession kill 掉,如何 kill 呢? 试一试下面的语句吧。

ALTER SYSTEM KILL SESSION '<block_session_sid>,<block_session_serial#>';
ALTER SYSTEM KILL SESSION '113,55609';

如果没有发生阻塞,系统就是很慢,该怎么办呢?在" Oracle 查询耗时 SQL"找答案吧。


--更多参见:Oracle SQL 优化精萃

-- 声明:转载请注明出处

-- Last edited on 2015-08-28

-- Created by ShangBo on 2015-08-07

-- End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值