在有點陣圖索引的表上進行DML操作與enq: TX - row lock contention等待事件問題分析
阿新 • • 發佈:2018-12-07
在有點陣圖索引的表上進行DML操作與enq: TX - row lock contention等待事件問題分析
前言
本文通過模擬實驗,來分析 有點陣圖索引的表的DML操作 對資料庫造成的影響。
模擬場景
-
生成資料
SQL> create table bm_table (id number, name varchar2(20), gender varchar2(1)); SQL> create bitmap index idx_bm_table on bm_table(
-
多個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
-
查詢此時資料庫的等待事件
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
等待事件 -
檢視ASH 報告
從這可以看住鎖住的物件是索引:IDX_BM_TABLE,把索引刪除後,delete操作能順利進行。
總結
點陣圖索引存放的索引鍵值指向的多行,當對錶進行DML操作時,同一鍵值的行,都將會被鎖住,這時多個會話來執行DML操作時,就會造成阻塞。
所以在遇到有點陣圖索引的表時,建議刪除點陣圖索引優化
。