oracle 等待原因查找,查询引起锁等待的SQL语句
本帖最后由 bfc99 于 2014-9-22 17:34 编辑
主要通过四个性能视图:
1、v$locked_object 查看当前哪些对象上有锁,及其所属的会话。
2、v$session_blocker 查看相关会话的阻止关系,即谁阻止了谁,谁是锁之源。
3、v$session 查看指定会话上运行的SQL_ID
4、v$sql 查看指定SQL_ID的具体内容。
举例如下:
新建会话a
SQL> select * from a for update;
ID COL1
---------- --------------------------------------------------------------------------------
1 1
0 2
SQL>
再新建一个会话b,在这个会话中,查看目前被锁定的对象。
SQL> SELECT object_id,session_id,locked_mode FROM v$locked_object;
OBJECT_ID SESSION_ID LOCKED_MODE
---------- ---------- -----------
19824 125 3
可以看到,目前被锁定的对象ID是19824,会话的SID是125.(在我的环境下,经查询,可以确定19824就是表a)
再新建一个会话C,发出另一个语句
SQL> select * from a where id=1 for update;
回到会话b,查看当前的对象锁定情况。
SQL> SELECT object_id,session_id,locked_mode FROM v$locked_object;
OBJECT_ID SESSION_ID LOCKED_MODE
---------- ---------- -----------
19824 16 3
19824 125 3
可以发现,多了一行,其对象ID是一样的,会话ID为16.显然,在这种情况下,我们可以很清楚地知道是SID为125的会话,阻止了SID为16的会话对表a的锁定。但如果我们不是这样一步一步的监控,就不知道到底是谁阻止了谁。这时,可以借助v$session_blocker视图来判断。
还是在会话b中,执行以下语句:
SQL> SELECT SID,blocker_sid FROM v$session_blockers;
SID BLOCKER_SID
---------- -----------
16 125
从这里就可以看出,阻止者是SID为125的会话,而被阻止的是SID为16的会话。
接下来,我们就要去v$session中,找出SID125上到底运行的是哪个SQL语句。
SQL> SELECT SID,sql_id,prev_sql_id FROM v$session WHERE SID IN (16,125);
SID SQL_ID PREV_SQL_ID
---------- ------------- -------------
16 8w0ct9utt04pf 8w0ct9utt04pf
125 14w0qs44p3w6u
可以看到,SID125上当前(SQL_ID列)为空,说明当前该会话上没有正在跑的SQL(select * from a for update已经执行完毕,只是还没有提交或回滚),而上一条运行过的SQL_ID(prev_sql_id列)是有同内容的,用它去v$sql中去查。
SQL> SELECT sql_text FROM v$sql WHERE sql_id='14w0qs44p3w6u';
SQL_TEXT
--------------------------------------------------------------------------------
select * from a for update
SQL>
可见,已经可以找到引起这个锁等待最初的语句了。
oracle 等待原因查找,查询引起锁等待的SQL语句相关推荐
- Oracle中如何查找未使用绑定变量的SQL语句?
Oracle中如何查找未使用绑定变量的SQL语句? 利用V$SQL 视图的 FORCE_MATCHING_SIGNATURE 字段可以识别可能从绑定变量或 CURSOR_SHARING 获益的 SQL ...
- 查询CPU占用高的SQL语句的解决方案
触发器造成死锁.作业多且频繁.中间表的大量使用.游标的大量使用.索引的设计不合理.事务操作频繁.SQL语句设计不合理,都会造成查询效率低下.影响服务器性能的发挥.我们可以使用sql server自带的 ...
- MySQL查询本年的数据的sql语句
MySQL查询本年的数据的sql语句: SELECT * FROM 表名 WHERE YEAR(时间字段)=YEAR(NOW());
- mysql查阅某个日期的语句_mysql查询指定日期时间内的sql语句及原理
查询指定日期时间内的sql语句的实现原理: 如果是月份就是当前的月减去你要统计的时间,比如要查询数据库中从今天起往前三个月的所有记录. 另外,在数据库设计阶段,要注意时间字段为int(11),保存在数 ...
- 创建oracle 数据库表空间,角色,用户的sql语句
创建oracle 数据库表空间,角色,用户的sql语句 1.创建角色 CREATE ROLE "QIUDINGROLE" NOT IDENTIFIED; GRANT "C ...
- 查看锁表进程SQL语句
查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao ...
- c mysql查询年月日_mysql查询指定日期时间内的sql语句及原理
查询指定日期时间内的sql语句的实现原理: 如果是月份就是当前的月减去你要统计的时间,比如要查询数据库中从今天起往前三个月的所有记录. 另外,在数据库设计阶段,要注意时间字段为int(11),保存在数 ...
- 怎样查找某个sp中哪条sql语句存在性能问题。
---查找sp里面的哪条sql语句,消耗的buffer gets最多,或消耗时间最多的进行优化 select TO_CHAR(T.Begin_interval_time, 'MM-DD HH24:MI ...
- mysql查看cpu使用高sql语句_查询CPU占用高的SQL语句
触发器造成死锁.作业多且频繁.中间表的大量使用.游标的大量使用.索引的设计不合理.事务操作频繁.SQL语句设计不合理,都会造成查询效率低下.影响服务器性能的发挥.我们可以使用sql server自带的 ...
最新文章
- 前端验证码后端返回一个图片_Web后端开发(6)——简易图片验证码的制作
- android studio安装教程博客园独王,Android Studio安装与配置
- 简单部署 群晖 ×××
- HUNAN 11560 Yangyang loves AC(二分+贪心)
- 11 Python之初识函数
- 数据结构时间复杂度T(n)=O(f(n))的含义
- 华为不可参与 IEEE 审稿但可继续提供赞助;谷歌限制 Chrome 接口惹非议;Mozilla 号召用户换火狐 | 开发者周刊...
- Android通知频道,通知点
- 微信小程序—给图片添加相框
- 前后端不分离,分页器组件(python-dango)
- Kinect Fusion三维重建
- flutter 如何实现上下标效果
- 正式宣布,小米10在高端市场碾压华为,夺下电商平台销量第一名
- uniapp 多语言版本demo in18
- 立创开源丨基于GD32E230C8T6芯片的开发评估板
- 基于MQTT阿里云物联网手机远程控制ESP8266
- echarts gallery,echarts社区地址(可视化作品分享的地址)
- python布尔函数_Python内置bool函数详细介绍
- 三分屏课件制作_教你使用iSpring Suite制作PPT二分屏课件
- sv 从0到1 procedural/function
热门文章
- 99%的人都理解错了GET与POST的区别
- 将指定内容写入目标文件(日志)
- 【poj2096】Collecting Bugs 期望dp
- Android 虚线分割Shape
- servelt笔记一
- HDU 3240 Counting Binary Trees 数论-卡特兰数
- C# list导出Excel(二)
- SAC 智能版面分析技术(structure Analysis Core )
- 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例TableBean---大数据之hadoop3.x工作笔记0129
- ES6新特性_ES6中模块暴露数据语法汇总---JavaScript_ECMAScript_ES6-ES11新特性工作笔记043