Oracle编程艺术学习笔记-位图索引(bitmap index)
2011-12-26 21:48
429 查看
对于B*树索引,通常索引条目和行之间存在一种一对一的关系:一个索引条目就指向一行。
而对于位图索引,一个索引条目则使用一个位图同时指向多行。
使用create bitmap index...来创建位图索引。
位图索引适用于相异基数(distinct cardinality)低而且通常只读的数据(相异基数低的是指相对于表中的总行数,数据只有很少的几个不同值)。
考虑在一个有100万行的表中,某列只有3个可取值:Y、N和NULL。如果需要频繁地统计多少行有值Y,这就很适合建立位图索引。
如果在多个列上各自建立了位图索引,在这些列上进行的AND,OR,NOT的组合查询,Oracle只需要在对这些索引的位图进行AND,OR,NOT操作,就能得到结果集。
位图索引在读密集的环境中能很好地工作,但是对于写密集的环境则极不适用。
原因在于,一个位图索引键条目指向多行。如果一个会话修改了所索引的数据,那么在大多数情况下,这个索引条目指向的所有行都会被锁定。Oracle无法锁定一个位图索引条目中的单独一位;而是会锁定这个位图索引条目。
这样将大大影响并发性,因为更新一行时,需要独占地访问其中两个索引键条目:对应老值的索引键条目和对应新值的索引键条目。这两个条目指向的很多行就不允许其他会话修改,直到UPDATE提交。
因此,一般不适合于OLTP系统。
位图联结索引(bitmap join index)
位图联结索引允许使用另外某个表的列对一个给定表建立索引。
举例来说,有EMP表和DEPT表,EMP有指向DEPT 的一个外键(DEPTNO列),DEPT表有一个DNAME属性(部门名)。
位图联结索引可以有效地回答诸如“销售部门有多少人”这样的问题。
创建位图联结索引有一个先决条件,联结条件必须联结到另一个表中的主键或惟一键。
例如:
view
plain
tony@ORA11GR2> create bitmap index emp_bm_idx on emp(dept.dname)
2 from emp, dept where emp.deptno = dept.deptno;
Index created.
tony@ORA11GR2> select count(*) from emp, dept
2 where emp.deptno = dept.deptno
3 and dept.dname = 'SALES';
Execution Plan
----------------------------------------------------------
Plan hash value: 2538954156
-------------------------------------------------------------------------------
| Id |Operation |Name |Rows |Bytes|Cost (%CPU)|Time |
-------------------------------------------------------------------------------
| 0|SELECT STATEMENT | | 1| 3| 1 (0)|00:00:01|
| 1| SORT AGGREGATE | | 1| 3| | |
| 2| BITMAP CONVERSION COUNT | | 5| 15| 1 (0)|00:00:01|
|* 3| BITMAP INDEX SINGLE VALUE|EMP_BM_IDX| | | | |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMP"."SYS_NC00009$"='SALES')
可以看到,不需要访问DEPT表,仅通过索引就可以回答上述查询。
而对于位图索引,一个索引条目则使用一个位图同时指向多行。
使用create bitmap index...来创建位图索引。
位图索引适用于相异基数(distinct cardinality)低而且通常只读的数据(相异基数低的是指相对于表中的总行数,数据只有很少的几个不同值)。
考虑在一个有100万行的表中,某列只有3个可取值:Y、N和NULL。如果需要频繁地统计多少行有值Y,这就很适合建立位图索引。
如果在多个列上各自建立了位图索引,在这些列上进行的AND,OR,NOT的组合查询,Oracle只需要在对这些索引的位图进行AND,OR,NOT操作,就能得到结果集。
位图索引在读密集的环境中能很好地工作,但是对于写密集的环境则极不适用。
原因在于,一个位图索引键条目指向多行。如果一个会话修改了所索引的数据,那么在大多数情况下,这个索引条目指向的所有行都会被锁定。Oracle无法锁定一个位图索引条目中的单独一位;而是会锁定这个位图索引条目。
这样将大大影响并发性,因为更新一行时,需要独占地访问其中两个索引键条目:对应老值的索引键条目和对应新值的索引键条目。这两个条目指向的很多行就不允许其他会话修改,直到UPDATE提交。
因此,一般不适合于OLTP系统。
位图联结索引(bitmap join index)
位图联结索引允许使用另外某个表的列对一个给定表建立索引。
举例来说,有EMP表和DEPT表,EMP有指向DEPT 的一个外键(DEPTNO列),DEPT表有一个DNAME属性(部门名)。
位图联结索引可以有效地回答诸如“销售部门有多少人”这样的问题。
创建位图联结索引有一个先决条件,联结条件必须联结到另一个表中的主键或惟一键。
例如:
view
plain
tony@ORA11GR2> create bitmap index emp_bm_idx on emp(dept.dname)
2 from emp, dept where emp.deptno = dept.deptno;
Index created.
tony@ORA11GR2> select count(*) from emp, dept
2 where emp.deptno = dept.deptno
3 and dept.dname = 'SALES';
Execution Plan
----------------------------------------------------------
Plan hash value: 2538954156
-------------------------------------------------------------------------------
| Id |Operation |Name |Rows |Bytes|Cost (%CPU)|Time |
-------------------------------------------------------------------------------
| 0|SELECT STATEMENT | | 1| 3| 1 (0)|00:00:01|
| 1| SORT AGGREGATE | | 1| 3| | |
| 2| BITMAP CONVERSION COUNT | | 5| 15| 1 (0)|00:00:01|
|* 3| BITMAP INDEX SINGLE VALUE|EMP_BM_IDX| | | | |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMP"."SYS_NC00009$"='SALES')
可以看到,不需要访问DEPT表,仅通过索引就可以回答上述查询。
相关文章推荐
- Oracle 9i & 10g编程艺术-深入数据库体系结构-学习笔记(持续更新中)
- Oracle 9i&10g编程艺术 学习笔记01
- Oracle编程艺术学习笔记(1)
- Oracle编程艺术学习笔记 - 准备工作
- Oracle编程艺术学习笔记 - 第一章
- Oracle 9i&10g编程艺术 学习笔记02
- javascript_DOM 编程艺术学习笔记(四)
- JS DOM编程艺术——JS图片库—— JS学习笔记2015-7-8(第79天)
- javascript_DOM 编程艺术学习笔记(八)
- 【数据库学习笔记】Oracle_03_PL/SQL深入:游标编程,自定义异常
- 【Java并发编程的艺术】【学习笔记】ThreadLocal与Fork/Join
- Oracle专家高级编程学习笔记( 二)
- JS DOM编程艺术——CSS-DOM—— JS学习笔记2015-7-19(第87天)
- 【第三章-DOM】javascript DOM 编程艺术-学习笔记
- JS DOM编程艺术学习笔记(二)
- oracle编程艺术笔记1
- Oracle编程高手箴言:位图索引(Bitmap Index)的故事
- JavaScript_DOM编程艺术第二版学习笔记-第10章
- JS DOM编程艺术——动态创建标记—— JS学习笔记2015-7-13(第83天)
- JS DOM编程艺术——重回图片库—— JS学习笔记2015-7-14(第84天)