ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 位图索引(bitmap-index)

位图索引(bitmap-index)

原创 Linux操作系统 作者:pingley 时间:2012-04-08 20:22:33 0 删除 编辑
位图索引(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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    717396