队列等待之enq: TX - row lock contention
【性能优化】队列等待之enq: TX - row lock contention
问题背景:
客户反映某条sql DELETE SHAREINNERDOC WHERE SOURCEID=:B1<br/>这个执行时间太长
问题解决
1>
查看awr报告:
有队列等待之enq: TX - row lock contention,对应的sql也是客户提供的sql
enq: TX - row lock contention 通常是Application级别的问题。通常情况下,Oracle数据库的等待事件enq: TX - row lock contention会在下列三种情况下会出现。
(一)第一种情况,是真正的业务逻辑上的行锁冲突,如一条记录被多个人同时修改。这种锁对应的请求模式是6(Waits for TX in mode 6 :A 会话持有row level lock,B会话等待这个lock释放。)。不同的session更新或删除同一个记录。(This occurs when one application is updating or deleting a row that another session is also trying to update or delete. )
(二)第二种情况,是唯一键冲突(In mode 4,唯一索引),如主键字段相同的多条记录同时插入。这种锁对应的请求模式是4。这也是应用逻辑问题。表上存在唯一索引,A会话插入一个值(未提交),B会话随后也插入同样的值;A会话提交后,enq: TX - row lock contention消失。
(三)第三种情况,是bitmap索引的更新冲突(in mode 4 :bitmap),就是多个会话同时更新bitmap索引的同一个数据块。源于bitmap的特性:位图索引的一个键值,会指向多行记录,所以更新一行就会把该键值指向的所有行锁定。此时会话请求锁的对应的请求模式是4。bitmap索引的物理结构和普通索引一样,也是 B-tree 结构,但它存储的数据记录的逻辑结构为"key_value,start_rowid,end_rowid,bitmap"。
其内容类似这样:"‘8088’,00000000000,10000034441,1001000100001111000"
Bitmap是一个二进制,表示 START_ROWID 到 END_ROWID 的记录,1 表示等于 key_value即‘8088’的 ROWID 记录, 0 则表示不是这个记录。
在了解bitmap索引的结构之后,我们就能理解同时插入多条记录到拥有bitmap索引的表时,就会同时更新bitmap索引中一个块中的记录,等于某一个记录被同时更新,自然就会出现行锁等待。插入并发量越大,等待越严重。
(四)其他原因
It could be a primary key problem; a trigger firing attempting to insert, delete, or update a row; a problem with initrans; waiting for an index split to complete; problems with bitmap indexes;updating a row already updated by another session; or something else.
如果数据库一出现enq: TX - row lock contention等待,可以去看v$session和v$session_wait等视图。在v$session和v$session_wait中,如果看到的event列是enq: TX - row lock contention的,就表示这个会话正处于行锁等待。该等待事件的请求模式可以从v$session和v$session_wait的p1列中得到。
1 select sid, 2 chr(bitand(p1, -16777216) / 16777215) || 3 chr(bitand(p1, 16711680) / 65535) "Name", 4 (bitand(p1, 65535)) "Mode" 5 from v$session_wait 6 where event like 'enq%';
通过这个SQL可以将p1转换为易阅读的文字。
2> sql是个delete语句,查看一下执行计划,是否有索引
1 SQL_ID 4ggjbjszghd7x2 --------------------3 DELETE SHAREINNERDOC WHERE SOURCEID=:B14 5 Plan hash value: 27490407916 ----------------------------------------------------------------------------------------------------------------7 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |8 ----------------------------------------------------------------------------------------------------------------9 | 0 | DELETE STATEMENT | | | | 9 (100)| | 10 | 1 | DELETE | SHAREINNERDOC | | | | | 11 | 2 | TABLE ACCESS BY INDEX ROWID BATCHED| SHAREINNERDOC | 11 | 506 | 9 (0)| 00:00:01 | 12 | 3 | INDEX RANGE SCAN | DSHAREINDEXDOC_SOURCEID | 11 | | 3 (0)| 00:00:01 | 13 ----------------------------------------------------------------------------------------------------------------
可以看到SQL走的是INDEX RANGE SCAN,索引名称DSHAREINDEXDOC_SOURCEID
查看索引的类型为FUNCTION-BASED NORMAL
函数索引(Function-Based Indexes,FBI),它基于对表中列进行计算后的结果创建索引。函数索引在不修改应用程序的逻辑基础上提高了查询性能。如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引。当在查询中包含该函数时,数据库才会使用该函数索引。函数索引可以是一个B-Tree索引或位图索引。
用于生成索引的函数可以是算术表达式,也可以是一个包含SQL函数、用户定义PL/SQL函数、包函数,或C调用的表达式。当数据库处理INSERT和UPDATE语句时,它仍然必须计算函数才能完成对语句的处理。
对于函数索引的索引列的函数查询可以通过视图DBA_IND_EXPRESSIONS来实现,通过如下的SQL语句可以查询所有的函数索引:
SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE LIKE 'FUNCTION-BASED%';
查看这个索引是系统自动创建的,
而条件中引用的SOURCEID没有合理的索引,只有一个组合索引,两千万的数据没有合理的索引。。
为SOURCEID字段创建索引并收集统计信息,sql开始引用新的执行计划,等待事件enq: TX - row lock contention也没了
队列等待之enq: TX - row lock contention相关推荐
- 【故障处理】队列等待之enq: TX - row lock contention
[故障处理]队列等待之enq: TX - row lock contention 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能, ...
- 等待事件 enq:TX - row lock contention分析与解决
6月30日,数据库发生了大量锁表.大概持续1小时,并且越锁越多.后来通过业务人员停掉程序,并kill掉会话后解决. 几天后再EM上查看CPU占用: CPU发生了明显等待. 主要是由于enq:TX - ...
- 等待事件enq TX row lock contention分析
在Oracle数据库性能报告AWRRPT分析时,发现top 5等待事件第一位的是enq: TX - row lock contention.这个等待事件消耗了绝大多数的CPU资源,导致系统整理性能下降 ...
- Oracle死锁问题: enq: TX - row lock contention
前言 这篇文章也是记录近期遇到的问题以及从中学到的知识 ,近期一直在救火,有些问题自认为还是挺有代表性的,有兴趣的话再继续向下看 问题现象 线上反馈,执行批量处理EXCEL数据时,系统一直卡在进度滚动 ...
- enq: TX - row lock contention案例
在Oracle数据库性能报告AWRRPT分析时,发现top 5等待事件第一位的是enq: TX - row lock contention.这个等待事件消耗了绝大多数的CPU资源,导致系统整理性能下降 ...
- 一次大量enq: TX - row lock contention锁等待的问题
今天下午接到业务报障,系统出现问题,可能是数据库的问题 1,登录系统,查看等待事件,大量row lock 6:12:58] [16:12:58] SID SERIAL# OSUSER USERNAME ...
- enq: TX - row lock contention等待事件
http://www.oracleonlinux.cn/2012/11/resolve-row-lock-contention/ enq: TX - row lock contention 等待事件 ...
- Oracle-enq: TX - row lock contention 等待事件分析
什么是enq:TX - row lock contention等待: 等待事件enq:TX - row lock contention 是Oracle常见的几大等待事件之一,在开启的事务中,为了维护事 ...
- 详述由ENQ:TX – ROW LOCK CONTENTION引起的全局死锁处理过程
墨墨导读:ENQ: TX - row lock contention等待事件,是Oracle数据库里最常见的等待事件之一,一般是由于不同的session更新或删除同一条记录.唯一索引有重复索引.位图索 ...
最新文章
- java poi3.15 ppt,Apache POI PPT - 演示( Presentation)
- LeetCode: Convert Sorted Array to Binary Search Tree 解题报告
- php图片上传在哪个文件夹,php删除上传的图片及文件夹
- 使类和成员的可访问性最小化
- 云计算是怎样入侵统一通信领域的
- 使用 C++的第三方库 jsoncpp的步骤以及出现的问题
- iconfont 图标转为字体_App 中使用 Iconfont 的整套方案
- 小米汽车总部正式落户北京,注册地为北京经济技术开发区
- 2021-02-02 安卓闪退问题
- linux网络管理员认证考试,红帽认证系统管理员 (RHCSA) 考试
- 嵩天《Python网络爬虫与信息提取》实例4:股票数据定向爬虫
- m126a linux驱动下载,hpm126a驱动下载
- 变频器供电高频电子变压器电源电压检测
- JPG怎么批量转换成PDF
- github能访问但是ping不通
- 【ESXi】失败 – “scsi0:0”的磁盘类型 2 不受支持或无效。请确保磁盘已导入
- ThoughtWork培训总结
- matlab示波器图形保存,MATLAB中示波器数据的绘图与保存
- (课程笔记)Learn How to Learn: Powerful mental tools to help you master tough subjects
- 35岁以后软测就没有出路了吗?听听京东10年测开的经验分析