點陣圖索引(bitmap-index)

pingley發表於2012-04-08
點陣圖索引(bitmap-index)

點陣圖索引概念
點陣圖索引適合於(low cardinality)的情況,即column中只有很少部分的值是不同的。點陣圖索引類似一個二維的陣列,列代表的是column不同的取值,行代表某條記錄的取值。1所在的位置表示某條記錄在該列取什麼值。如下圖:
create bitmap index person_region on person (region);

        Row     Region   North   East   West   South
        1       North        1      0      0       0
        2       East         0      1      0       0
        3       West         0      0      1       0
        4       West         0      0      1       0
        5       South        0      0      0       1
        6       North        1      0      0       0
row1 在region 列的值是North,所以在點陣圖中North列的位置是1.
點陣圖索引的使用注意事項
點陣圖索引對使用複合條件(and,or)的查詢語句非常有用。因為點陣圖可以很方便的進行這些運算。點陣圖索引所帶來的查詢效能上的優勢會被DML操作效能的降低所抵消(修改點陣圖索引所花費的開銷要比平衡樹索引大),所以點陣圖索引更適合DML操作比較少的OLAP(資料倉儲)環境下。而且在高DML的環境下點陣圖索引很容易引起死鎖。
另外點陣圖索引具有高可壓縮的結構,這樣讀取點陣圖索引的速度為非常的快,但是卻需要更多的CPU資源來解壓縮點陣圖索引,所有需要在IO開銷,CPU開銷,儲存開銷方面做出選擇或者平衡。
模擬bitmap index 環境下死鎖的出現
session 1
SQL> select sid from V$mystat where rownum = 1;
       SID
----------
         1
SQL> create table test_bitmap
  2  (field varchar2(5));
Table created.
SQL> create bitmap index test_bitmap_idx on test_bitmap(field);
Index created.
SQL> insert into test_bitmap 
  2  values ('F');
1 row created.
session 2
SQL> select sid from V$mystat where rownum = 1;
       SID
----------
        30
SQL> insert into test_bitmap 
  2  values('T'); 
1 row created.
SQL> insert into test_bitmap 
  2   values('F');
#執行完這些語句後,去session 1執行 另外一條insert語句。
insert into test_bitmap
            *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
session 1
SQL> insert into test_bitmap
  2  values('T');
^Cinsert into test_bitmap
            *
ERROR at line 1:
ORA-01013: user requested cancel of current operation
該insert 語句會一直等待,所以我取消了。
session1 插入記錄以後點陣圖如下,同時session1 鎖定了bit-map index中的F值列。
row      field       F
  1           F          1 
session2 第一次插入記錄以後點陣圖如下,同時session2 鎖定了bit-map index中的T值列。
row      field       F     T
  1           F          1     0
  2           T          0     1
session2 第二次插入記錄以後理想情況下點陣圖是下面這樣子的,但是因為session1 鎖住了bit-map index中的F值列,所以session 2 卡在那邊,一直在waiting。。。。請求session1 的鎖。
row      field       F     T
  1           F          1     0
  2           T          0     1
  3           F          1     0
現在在session1 中發出的語句請求session 2的鎖。這時候資源請求的迴圈鏈構成了,出現死鎖oracle 探測到並報錯。
row      field       F     T
  1           F          1     0
  2           T          0     1
  3           F          1     0
  4           T          0     1
注:紅色部分實際上並不存在於點陣圖索引中,是為了說明理想情況下應該存在而引入的。


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

相關文章