前言
本文通过模拟实验,来分析 有位图索引的表的DML操作 对数据库造成的影响。
模拟场景
-
生成数据
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
-
多个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;
-
查询此时数据库的等待事件
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操作时,就会造成阻塞。
所以在遇到有位图索引的表时,建议删除位图索引优化
。