位圖索引(Bitmap Index)與數據DML LOCK場景問題解析
背景:有同事反應某個RAC數據庫的delete語句執行慢的問題。(他這個delete語句,是通過4個應用並發執行的情景)。後面通過AWR報告和查詢
v$sqlarea a,v$session s, v$locked_object三個視圖,發現鎖問題和等待事件“enq: TX - row lock contention”,和大量delete語句等待。通過分析得出表中有位圖索引,--位圖索引,對於更新一條記錄都會導致鎖被應用到大量的記錄上,導致數據庫大量鎖等待事件-- 通過刪除位圖索引,解決其數據庫效率問題。
AWR真實場景報告如下:

目的:本文通過模擬實驗例子,來研究分析位圖索引引起的鎖等待問題。
1.數據場景模擬(建立表和位圖索引)
SQL> create table test(id number,col varchar2(20));
Table created.
SQL> create bitmap index idx_t_col on test(col);
Index created.
2.插入數據
insert into test values(1,'A');
insert into test values(2,'A');
insert into test values(3,'A');
insert into test values(4,'B');
3.查看模擬數據
SQL> select * from test;
ID COL
---------- --------------------
1 A
2 A
3 A
4 B
4.模擬多會話,鎖問題


這裡三個會話,傳達非常重要的一個規律。如果col值相同的話,不同行會被鎖定。
而Oracle數據庫非常自豪的一個特性就是並發處理,但是加上了位圖索引之後,鎖定范圍的擴大化會導致並發的dml操作出現wait event事件,會話被阻塞。
5.查看鎖等待事件

6.查看session對應的鎖等待語句

進一步確認猜測是正確,刪除位圖索引,很好的解決這次數據庫的性能問題。