bitmap索引被广泛的用在有大量数据和即席查询(是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询条件的)但是并发事务处理水平较低数据仓库应用中。 对于这类应用,bitmap索引支持: 1 缩短大型即席查询的响应时间 2 与其他类型索引比较减少了大量的空间占用 3 即使在cpu和内存相对较少的硬件上,也有着显著的性能提升 4 在并行的DML(Data Manipulation Language是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除)和负载之间进行非常有效的维护 传统B树索引对大型表进行完全索引在空间方面非常昂贵,因为索引的大小可能比表中的数据大几倍。bitmap索引通常之占表数据大小的一小部分。 索引的目的是提供指向表中指定键值的行的指针。在常规索引中,这是通过存储具有该键值的行对应的每个键的rowid列表来实现的。在bitmap索引中,用每个键值的bitmap来替代rowid列表。 bitmap中,每一位对应一个可能的rowid,如果这一位有值(为1),那么说明具有相应rowid的行包含键值。映射函数将位的位置转换为真实的rowid,所以位图索引提供与常规索引相似的功能,只是它内部使用不同的表示。如果键值的数量很小,则位图索引非常节省空间。 bitmap索引在对于WHERE子句中包含多个查询条件的查询中非常有效。满足某些条件(但不是所有条件)的行在访问之前被过滤掉。这通常可以显著地改善查询的响应时间。 对数据仓库应用的好处 bitmap索引不适用于大量并发实物修改数据的OLTP应用中。这些索引主要应用于数据仓库中的决策支持,其中用户通常是查询数据而不是更新数据。 并行查询和并行DML与传统索引一样使用位图索引。 基数 对于低基数列(此列中不同的值相对较少),使用bitmap索引的优势最大:换言之,列中的不同值的数量相比较表的行数很小。性别这一列,只有两个不同的值(男人和女人),非常适用于bitmap索引。然而,数据仓库管理者们还是选择在具有更多基数的列上建立bitmap索引。 例如在一个具有一百万行的表上,具有10万个不同值的列适用于位图索引。在此列上建立bitmap索引的性能会超过B树索引,尤其是此列经常与其他列一起查询的时候。 B树索引对高基数列非常有效,换言之,此列有很多可能的值,例如用户名和手机号。数据仓库中,B树索引仅用在具有非常高基数的唯一列或其他列(这些列几乎也是唯一的)。数据仓库中的大多数索引应该是位图索引。 在即席查询和类似情况下,位图索引可以显著地提高查询性能。通过在将结果位图转换为rowid之前直接在bitmap上执行相应的布尔操作,可以快速解析查询的WHERE子句中的AND和OR条件。如果得到的行数非常小,那么就不用扫描全表就可以非常快速的相应查询。 bitmap例子 某公司客户数据的一部分 因为MARITAL_STATUS(结婚状态), REGION(地区), GENDER(性别), and INCOME_LEVEL(收入级别)这些列是低基数列(结婚状态和地区只有3种值,性别只有2种值,收入级别只有4种值),这些列非常适用于位图索引。bitmap索引不能用于CUSTOMER#列,因为这列是唯一的。此列上的唯一B树索引将按顺序提供最有效的标识和检索。 此列中的地区(region)列的位图索引,它由3个独立的位组成,每个位对应一个地区。 上图中的每一行对应CUSTOMER表中的一条记录。上图中每一个位的值取决于CUSTOMER表中对应行的值。 例如CUSTOMER中第一行的region为east,上图中的第一位到第三位分别代表 east,central,west, 所以上图第一行值为 1 0 0 。 调查该公司客户的人口趋势分析师可能会问:“我们在中部和西部的已婚客户有多少人?” , 对应的查询sql如下: SELECT COUNT(1) FROM customer WHERE MARITAL_STATUS = 'married' AND REGION IN ('central','west'); bitmap索引可以通过仅计算结果位图中的1的数量来高效的处理此查询,如下图。要识别满足条件的特定客户,将使用生成的位图来访问该表。 oracle官网链接: https://docs.oracle.com/cd/A84870_01/doc/server.816/a76994/indexes.htm#97322 程序员灯塔 转载请注明原文链接:【译文】bitmap indexes (位图索引) 喜欢 (0)