在有位图索引的表上进行DML操作与enq: TX - row lock contention等待事件问题分析

本文通过实验分析了位图索引在表上的DML操作导致的enq:TX-rowlockcontention等待事件,揭示了位图索引在多会话并发DML时可能引发的阻塞问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在有位图索引的表上进行DML操作与enq: TX - row lock contention等待事件问题分析

前言

本文通过模拟实验,来分析 有位图索引的表的DML操作 对数据库造成的影响。

模拟场景

  1. 生成数据

    SQL> create table bm_table (id number, name varchar2(20), gender varchar2(1));
    SQL> create bitmap index idx_bm_table on bm_table(gender);
    SQL> insert into bm_table values(1,'zhang san','M');
    SQL> insert into bm_table values(2,'li si','M');
    SQL> insert into bm_table values(3,'wang wu','F');
    SQL> insert into bm_table values(4,'zhao liu','F');
    SQL> commit;
    
    SQL> select * from bm_table;
    
    	ID NAME 		G
    ---------- -------------------- -
    	 1 zhang san		M
    	 2 li si		M
    	 3 wang wu		F
    	 4 zhao liu		F
    
    
  2. 多个session对表进行DML操作

    #会话1,执行删除id=1的数据
    SQL> delete from bm_table where id=1;
    
    1 row deleted.
    
    #会话2,执行删除id=3的数据,没有阻塞
    SQL> delete from bm_table where id=3;
    
    1 row deleted.
    
    #会话2,执行删除id=2的数据,处于等待状态
    SQL> delete from bm_table where id=2;
    
    
  3. 查询此时数据库的等待事件

    SQL> select v.sid, v.SERIAL#, v.PROGRAM, v.EVENT, v.p1, v.p2, v.p3, v.SQL_ID,s.SQL_TEXT
      from v$session v, v$sql s
      where v.SQL_ID=s.SQL_ID 
     and v.TYPE = 'USER';
    
    SID	SERIAL#	PROGRAM	EVENT	P1	P2	P3	SQL_ID	SQL_TEXT
    256	2557	plsqldev.exe	SQL*Net message from client	1413697536	1	0	6vs7uc4hft38t	select v.sid, v.SERIAL#, v.PROGRAM, v.EVENT, v.p1, v.p2, v.p3, v.SQL_ID,s.SQL_TEXT   from v$session v, v$sql s   where v.SQL_ID=s.SQL_ID  and v.TYPE = 'USER' 
    
    258	6274	sqlplus.exe	enq: TX - row lock contention	1415053316	458757	7280	91r3zdpu5q0j7	delete from bm_table where id=2
    

    此时数据库出现了enq: TX - row lock contention等待事件

  4. 查看ASH 报告
    在这里插入图片描述
    在这里插入图片描述
    从这可以看住锁住的对象是索引:IDX_BM_TABLE,把索引删除后,delete操作能顺利进行。

总结

位图索引存放的索引键值指向的多行,当对表进行DML操作时,同一键值的行,都将会被锁住,这时多个会话来执行DML操作时,就会造成阻塞。

所以在遇到有位图索引的表时,建议删除位图索引优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值