1. 程式人生 > >在有點陣圖索引的表上進行DML操作與enq: TX - row lock contention等待事件問題分析

在有點陣圖索引的表上進行DML操作與enq: TX - row lock contention等待事件問題分析

在有點陣圖索引的表上進行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操作時,就會造成阻塞。

所以在遇到有點陣圖索引的表時,建議刪除點陣圖索引優化