【點陣圖索引】在點陣圖索引列上進行更新操作的鎖代價研究

secooler發表於2011-05-03
   點陣圖索引的特點是不支援行級鎖定,鎖代價很高,請參見文章《【實驗】【Bitmap Index】點陣圖索引的鎖代價研究》(http://space.itpub.net/519536/viewspace-611296)。

  提問:若將具有點陣圖索引列的一類值更新為其他已有值資訊,是否會鎖定兩類值的全部記錄?

  回答:會!

  這也進一步體現了點陣圖索引導致的極高鎖代價!

  我們用實驗來說明一下這個問題,這樣會更加的直觀。

1.建立測試表T
sec@ora10g> create table t (x varchar2(10));

Table created.

2.初始化4條資料
sec@ora10g> insert into t values ('Secooler');

1 row created.

sec@ora10g> insert into t values ('Secooler');

1 row created.

sec@ora10g> insert into t values ('HOU');

1 row created.

sec@ora10g> insert into t values ('HOU');

1 row created.

sec@ora10g> commit;

Commit complete.

sec@ora10g> select * from t;

X
----------
Secooler
Secooler
HOU
HOU

3.在T表的X列上建立點陣圖索引
sec@ora10g> create bitmap index t_bitmap_idx on t(x);

Index created.

4.設計更新操作場景
1)第一個session中嘗試將已有的“HOU”記錄更新為已有的記錄“Secooler”
sec@ora10g> update t set x = 'Secooler' where x = 'HOU';

2 rows updated.

2)第二個session中嘗試更新“Secooler”記錄行
sec@ora10g> update t set x = 'Good luck.' where x='Secooler';

  特別注意,此時出現了鎖等待現象!此條語句無法完成。

  因此也證實了若將具有點陣圖索引列的一類值更新為其他已有值資訊,的確會鎖定兩類值的全部記錄這個結論。

5.小結
  透過這個實驗大家應該更加深入體會到點陣圖索引的鎖代價是非常大的。在考慮使用點陣圖索引時需要重點考慮這些因素。

Good luck.

secooler
11.05.03

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-694385/,如需轉載,請註明出處,否則將追究法律責任。

相關文章