队列等待之enq: TX - row lock contention

article/2025/8/28 12:02:57

【性能优化】队列等待之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也没了

 

 


http://chatgpt.dhexx.cn/article/mKCRE5gF.shtml

相关文章

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

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

java -- 随机获取字母或者数字

java只有涉及到随机的&#xff0c;最经常用到的方法就是Math.random()&#xff0c;这个方法会返回一个大于0小于1的随机数( 能取0不能取1 )&#xff0c;如果我们要随机0-9&#xff0c;就可以用&#xff08;Math.random()*10&#xff09;来表示&#xff0c;随机0-99也类似如此操…

JavaScript生成随机字母数字字符串

如何使用javascript生成随机字母数字字符串&#xff1f;下面本篇文章就来给大家介绍一下使用JavaScript生成随机字母数字字符串的方法&#xff0c;希望对大家有所帮助。 方法一&#xff1a;Math.random()方法和Math.floor()方法 ● 创建一个函数&#xff0c;该函数有两个参数…

Python - 怎么将一个数字拆分成多个随机数字

前情提要 使用numpy.random.choice()的时候&#xff0c;通过参数p&#xff08;一个列表&#xff09;来指定所给选择元素的选择概率。但参数p&#xff08;选择概率&#xff09;要保证和为1&#xff0c;这时我又想随机生成选择概率&#xff0c;所以现在的问题就是怎么将1拆分成多…

python随机生成一个数字_如何实现python随机生成数字?

今天小编就生成随机数,整理了多个方式,方便大家在项目时,根据自己的需求,直接拿来套用即可,以下内容相当详细,具体来看看吧~ 说明:python中生成随机数主要用到random模块,方法主要包括:randint、uniform、random、sample、choice等几种常用方法; 环境:Mac OS 10.1…

python随机生成三位数字_python3 随机生成数字

原博文 2019-11-25 10:07 − random模块 random.randint(1,10)--随机生成0-10之间的随机整数 random.uniform(1,10)--随机生成0-10之间的实数 random.randrange(9,100,10)--从9-100之间随机选取一个实数,差为10,也就是说从9,19,29,39,49... 0 3530 相关推荐 2019-12-0…

C#生成含数字字母的随机字符串

C#生成含数字字母的随机字符串 要求生成的字符串是随机的&#xff0c;也就是字母和数字都需要随机&#xff0c;既可能只包含数字&#xff0c;也可能只包含字母&#xff0c;也可能两者都有。 实现方式如下: 首先定义一个包含所有字母和数字的字符串和一个空串&#xff0c;随后…

css 随机 数,纯CSS实现随机效果

最近在Codepen上看到了Adir写的随机翻牌和找蛋蛋(可以想象是砸金蛋)效果&#xff0c;让我再次刷新了对CSS的认知。看到这两个效果之后我才知道&#xff0c;在CSS中除了可以实现 来自其他语言的随机性 众所周知&#xff0c;CSS是一种声明式的标记语言。在很多同学的认知中&#…

舒尔特表-5*5表格1-25个数字随机生成且不重复

大家好&#xff1a;最近在玩快速记忆&#xff0c;看到舒尔特表&#xff0c;整理出一版来。v1.0版本。 舒尔特表&#xff1a;5*5表格 1-25个数字&#xff0c;随机生成且不重复。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:/…

计算机随机数字excel,excel怎么生成随机数字 excel随机数字区间怎么设定

excel是我们日常生活中处理表格数据必备的工具&#xff0c;当我们知道了一定范围内的数值&#xff0c;并且不用精准的数值时&#xff0c;我们完全可以设置excel随机生成数字即可&#xff0c;怎么设置?很简单&#xff0c;下面小编为大家带来excel生成随机数字的详细教程&#x…

随机生成4个数字php,PHP随机生成4位数字的方法

//方法1 $code .mt_rand(1000,9999).; echo $code; echo ; //方法2 $code .mt_rand(1000,9999).; echo $code; echo ; //方法3 $code ; $code..mt_rand(0,9).; $code..mt_rand(0,9).; $code..mt_rand(0,9).; $code..mt_rand(0,9).; echo $code; echo ; //方法4 $code ; $r…

java生成1到10的随机数_用java生成一个1到10十个数字随机排列的数组

效果如图&#xff1a; 代码如下public class ArrayListToAry { public static void main(String[] args) { // 数组 int[] ary new int[10]; // 集合 ,临时集合temp存放1~10个数字 ArrayList temp new ArrayList(); //list集合存放需要的数字 ArrayList list new ArrayList(…

你知道如何生成随机数吗?(超详细附图)

目录 &#x1f609;前言 &#x1f378;如何用C语言实现随机数 &#x1f379;随机数原理 &#x1f379;rand函数&#xff08;生成随机数&#xff09; &#x1f379;srand&#xff08;避免每次运行程序产生的随机数都相同&#xff09; &#x1f379;时间戳 &#x1f964;t…

如何批量生成个位随机数字

众所周知&#xff0c;条码软件可以批量打印条码二维码以及各种各样的产品标签&#xff0c;功能比较齐全&#xff0c;在输入数据时有各种类型&#xff0c;比如手动输入、计数器生成、数据库字段、日期时间、序列生成、流水号等等。今天小编给大家介绍如何随机生成个位数字。 打开…

使用cmd查看端口号

打开cmd命令窗口&#xff1b;输入 netstat -nao|findstr "端口号" &#xff1b;在本地地址中查看端口号&#xff0c;并记住该进程的PID&#xff1a;在运行中输入taskmgr打开任务管理器&#xff0c;在名称一处右击&#xff0c;选中PID&#xff1b;查看第三步的PID所对…

【cmd命令】查看端口占用情况

1、昨晚安装BIS 6遇到一个问题&#xff0c;本地10000端口被占用&#xff0c;安装进行不下去。 2、通过netstat -ano&#xff08;-a 显示所有socket&#xff0c;包括正在监听的&#xff1b;-n 以网络IP地址代替名称&#xff0c;显示出网络连接&#xff1b;o查看进程pid&#xff…

windows cmd关闭端口命令

netstat -ano|findstr 8906taskkill /pid 23440 /f

cmd解决端口被占用

文章目录 一、winr打开cmd窗口二、查找被占用端口的pid号&#xff0c;例如8080端口三、通过命令杀掉当前pid进程总结 一、winr打开cmd窗口 二、查找被占用端口的pid号&#xff0c;例如8080端口 输入命令&#xff1a;netstat -aon|findstr "8080" 如果有如下输出&…

cmd命令查看端口,并强制关闭该端口号

1.查看端口&#xff08;删除8080是指查看所有端口&#xff09; netstat -aon|findstr 8080 2.强制关闭端口号 taskkill /pid 3784 /f 例如&#xff1a;效果如下图

计算机cmd测试命令,常见CMD网络诊断命令

在维修电脑的时候&#xff0c;我们可以利用一些简单的CAM命令来查看当前网络的一些状态。 操作方法 ,在开始中找到运行框&#xff0c;输入cmd&#xff0c;打开批处理窗口。输入CMD命令按回车键。 1 Ping命令 ping IP地址 &#xff0d;t 用于测试此电脑到目标IP地址的数据连通性…