【性能优化】队列等待之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相关推荐

  1. 【故障处理】队列等待之enq: TX - row lock contention

    [故障处理]队列等待之enq: TX - row lock contention 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能, ...

  2. 等待事件 enq:TX - row lock contention分析与解决

    6月30日,数据库发生了大量锁表.大概持续1小时,并且越锁越多.后来通过业务人员停掉程序,并kill掉会话后解决. 几天后再EM上查看CPU占用: CPU发生了明显等待. 主要是由于enq:TX - ...

  3. 等待事件enq TX row lock contention分析

    在Oracle数据库性能报告AWRRPT分析时,发现top 5等待事件第一位的是enq: TX - row lock contention.这个等待事件消耗了绝大多数的CPU资源,导致系统整理性能下降 ...

  4. Oracle死锁问题: enq: TX - row lock contention

    前言 这篇文章也是记录近期遇到的问题以及从中学到的知识 ,近期一直在救火,有些问题自认为还是挺有代表性的,有兴趣的话再继续向下看 问题现象 线上反馈,执行批量处理EXCEL数据时,系统一直卡在进度滚动 ...

  5. enq: TX - row lock contention案例

    在Oracle数据库性能报告AWRRPT分析时,发现top 5等待事件第一位的是enq: TX - row lock contention.这个等待事件消耗了绝大多数的CPU资源,导致系统整理性能下降 ...

  6. 一次大量enq: TX - row lock contention锁等待的问题

    今天下午接到业务报障,系统出现问题,可能是数据库的问题 1,登录系统,查看等待事件,大量row lock 6:12:58] [16:12:58] SID SERIAL# OSUSER USERNAME ...

  7. enq: TX - row lock contention等待事件

    http://www.oracleonlinux.cn/2012/11/resolve-row-lock-contention/ enq: TX - row lock contention 等待事件 ...

  8. Oracle-enq: TX - row lock contention 等待事件分析

    什么是enq:TX - row lock contention等待: 等待事件enq:TX - row lock contention 是Oracle常见的几大等待事件之一,在开启的事务中,为了维护事 ...

  9. 详述由ENQ:TX – ROW LOCK CONTENTION引起的全局死锁处理过程

    墨墨导读:ENQ: TX - row lock contention等待事件,是Oracle数据库里最常见的等待事件之一,一般是由于不同的session更新或删除同一条记录.唯一索引有重复索引.位图索 ...

最新文章

  1. java poi3.15 ppt,Apache POI PPT - 演示( Presentation)
  2. LeetCode: Convert Sorted Array to Binary Search Tree 解题报告
  3. php图片上传在哪个文件夹,php删除上传的图片及文件夹
  4. 使类和成员的可访问性最小化
  5. 云计算是怎样入侵统一通信领域的
  6. 使用 C++的第三方库 jsoncpp的步骤以及出现的问题
  7. iconfont 图标转为字体_App 中使用 Iconfont 的整套方案
  8. 小米汽车总部正式落户北京,注册地为北京经济技术开发区
  9. 2021-02-02 安卓闪退问题
  10. linux网络管理员认证考试,红帽认证系统管理员 (RHCSA) 考试
  11. 嵩天《Python网络爬虫与信息提取》实例4:股票数据定向爬虫
  12. m126a linux驱动下载,hpm126a驱动下载
  13. 变频器供电高频电子变压器电源电压检测
  14. JPG怎么批量转换成PDF
  15. github能访问但是ping不通
  16. 【ESXi】失败 – “scsi0:0”的磁盘类型 2 不受支持或无效。请确保磁盘已导入
  17. ThoughtWork培训总结
  18. matlab示波器图形保存,MATLAB中示波器数据的绘图与保存
  19. (课程笔记)Learn How to Learn: Powerful mental tools to help you master tough subjects
  20. 35岁以后软测就没有出路了吗?听听京东10年测开的经验分析

热门文章

  1. 什么是cache,有什么用?
  2. 3917 【NOIP2014模拟11.2A组】福慧双修 (Standard IO)题解
  3. 2014年度企业云存储盘点
  4. 发言稿开场白范文_演讲稿开场白范文集锦
  5. twitter账号被冻结如何申诉,已成功解冻(我是第一次被冻结,听闻二次冻结会永久冻结)
  6. 【Demllie航天】火箭方程
  7. idea上最好用的小说插件--chapter_reader(不好用你锤死我)
  8. 英国Hostinger免费空间申请和使用教程
  9. (二)Redis——持久化详细解析
  10. mysql设置初始密码(linux)