您的位置:首页 > 数据库

查询数据库锁以及锁对应SQL语句的若干查询SQL

2011-01-12 00:00 357 查看
这几天新上线项目的WebLogic频繁出现线程阻塞的情况,导致客户端链接超时,影响正常业务办理。开始以为遇到了WebLogic的bug,针对相关问题修复补丁后问题依然,于是开始考虑是否数据库部分有问题,因为每次线程阻塞都与oracle的操作有关。今天再次出现阻塞问题时,查询了一下数据库锁,发现确实存在数据库锁,开始怀疑应用中存在问题SQL。因业务不能长时间停滞,故重启WebLogic解决故障后,检查应用中锁涉及的相关SQL语句,未发现问题SQL。于是搜集一番SQL语句,以备再次出现问题时,通过session的sid查询出问题SQL的所在。

下述SQL语句一部分是从网上陆陆续续找到的,一部分是从oracle书籍中翻到到,整理在这里。

两个查询数据库锁的SQL,第一个显示了锁对应的对象都有什么,比如表名。第二个显示的信息更多些,比如说锁什么时间开始的,当前的状态为何等等。下述SQL需要具有DBA角色的用户进行查询。select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id;

select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

-- 查询会话ID
select username,sid,serial# from v$session;

-- 查询spid
select pro.spid
from v$session ses,v$process pro where ses.sid=xxx and ses.paddr=pro.addr;

-- 查询会话对应sql
SELECT SE.sid,
SE.serial#,
PR.spid,
SE.status,
SUBSTR(SE.program, 1, 10) PROG,
SUBSTR(SE.machine, 1, 10) MACH,
SQ.sql_text
FROM v$session SE, v$sqlarea SQ, v$process PR
WHERE SE.paddr = PR.ADDR(+)
AND SE.sql_address = SQ.address(+)
AND schemaname <> 'SYS'
ORDER BY SE.sid

-- 查询v$session_wait获取各进程等待事件

select sid, event,p1, p1text from v$session_wait;

-- 通过已知的session的sid联合v$session、v$sqltext视图获得相关session正在执行的完整的SQL语句

select a.sql_text from v$sqltext a, v$session b
where a.hash_value=b.sql_hash_value
and b.sid='102';

-- 检查SQL的执行计划 此SQL需要使用执行SQL的用户进行检查

set autotrace trace explain;

此处写入执行的相关SQL,回车,即会显示SQL的执行计划。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: