位图索使用位图标识被索引的列值。对于低基数且表尺寸大的列来说,这是一个理想的索引。该索引通常不适合于有大量更新任务的表,但很适合于数据仓库的应用。
位图索引由表示索引中每列一个字位的流(0或1)组成。位图索引比普通的B-树索引更为紧密。
B-树索引与位图索引
| B-树索引 | 位图索引 |
|---|---|
| 适于高基数的数据 | 适于低基数的数据 |
| 适于OLTP数据库 | 适于数据仓库应用 |
| 使用大量的空冋 | 使用的窄间相对少 |
| 易于更新 | 难于更新 |
要想创建位图索引,使用CREATE INDEX语句及关键字BITMAP:
CREATE BITMAP INDEX gender_idx ON employee(gender) TABLESPACE emp_index_05;
当在某些非常大的表中把普通的B-树索引替换成位图索引时,可以看到查询性能有明显改进。但是,每个位图索引项都覆盖了表中大量的数据行,因此,如果表中数据被更新、插入或删除的话,那么位图索引的更改需求就会特别大,而且索引的尺寸也将明显地增加。解决位图索引尺寸增加以及性能下降问题的唯一办法是,通过定期重建索引来维护位图索引。对于有大量插入、删除和更新任务的表,位图索引不是最好的选择。
位图连接索引
从Oracle9i起,可以创建一个增强的位图索引类型,称为"位图连接索引"(bitmap join index).位图连接索引是表示两个或多个表之间连接的一种位图索引。对连接的第一个表中的列的每个值,位图连接索引存储其他表中和第一个表中的列具有相同值的对应行的ROWIDO位图连接索引是包含一个连接条件的物化视图的一种可替换形式。存储相关的ROWID所需的存储空间可能远小于存储视图本身的结果所需的空间。
在该示例中,发现HR部门频繁地在DEPARTMENTJD列上连接EMPLOYEES和DEPARTMENTS表。作为创建物化视图的一种可替换的方法,决定创建一个位图连接索引。下面是创建此位图连接索引的SQL命令:
create bitmap index hr.emp_dept_bj_ix on hr.employees(hr.departments.department_id)
from hr.employees, hr.departments
where hr.employees.department_id = hr.departments.department_id;
位图连接索引的使用有几个限制:
★当正在使用位图连接索引时,位图连接索引中只有一个表可以由不同的事务处理并发地进行更新。
★在连接中任何表的出现都不能多于一次。
★不能在一个IOT或临时表上创建位图连接索引。
★不能使用UNIQUE属性来创建位图连接索引。
★用于索引的连接列必须是主键,或者它们在表中具有唯一的约束,并且该表正要连接到带有位图索引的表。




