位图索引(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
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/