位图索引(bitmap-index)

位图索引(bit map-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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26110315/viewspace-720662/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值