数据库索引-位图索引

在学习hive的时候遇到了位图索引,查了查资料。现则很难管理如下,算是个基础知识的了解吧。

一:概念介绍:

百度百科:

  位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置.

当然百度百科你们懂的。。。来看看wiki的吧

维基百科:

  Bitmap indexes have traditionally been considered to work well for low-cardinality columns, which have a modest number of distinct values, either absolutely, or relative to the number of records that contain the data. The extreme case of low cardinality is Boolean data (e.g., does a resident in a city have internet access?), which has two values, True and False. Bitmap indexes use bit arrays (commonly called bitmaps) and answer queries by performing bitwise logical operations on these bitmaps. Bitmap indexes have a significant space and performance advantage over other structures for query of such data. Their drawback is they are less efficient than the traditional B-tree indexes for columns whose data is frequently updated: consequently, they are more often employed in read-only systems that are specialized for fast query - e.g., data warehouses, and generally unsuitable for online transaction processing applications.

  Some researchers argue that bitmap indexes are also useful for moderate or even high-cardinality data (e.g., unique-valued data) which is accessed in a read-only manner, and queries access multiple bitmap-indexed columns using the AND, OR or XOR operators extensively.

ok ,翻译应该很简单的。

二:示例:

  如果,简介看不懂,来看实例吧:

1.需求描述:

  有张表名为table的表,

由三列组成,分别是姓名、性别和婚姻状况,其中性别只有男和女两项,婚 姻状况由已婚、未婚、离婚这三项,该表共有100w个记录。现在有这样的查询: select * from table where Gender=‘男’ and Marital=“未婚”?

  姓名(Name)  性别(Gender)  婚姻状况(Marital)

    张三       男         已婚

    李四       女         已婚

    王五       男         未婚

    赵六       女         离婚

    孙七       女         未婚

    ...        ...         ...

  1)不使用索引

    不使用索引时,数据库只能一行行扫描所有记录,然后判断该记录是否满足查询条件。

  2)B树索引

    对于性别,可取值的范围只有‘男‘,‘女‘,并且男和女可能各站该表的50%的数据,这时添加B树索引还 是需要取出一半的数据, 因此完全没有必要。相反,如果某个字段的取值范围很广,几乎没有重复,比 如身份证号,此时使用B树索引较为合适。事实上,当取出的行数据占用表中大部分的数据时,即使添加 了B树索引,数据库如oracle、mysql也不会使用B树索引,很有可能还是一行行全部扫描。

2. 位图索引出马

  如果用户查询的列的基数非常的小, 即只有的几个固定值,如性别、婚姻状况、行政区等等。要为这些 基数值比较小的列建索引,就需要建立位图索引。

   对于性别这个列,位图索引形成两个向量,男向量为10100...,向量的每一位表示该行是否是男,如果是 则位1,否为0,同理,女向量位01011。

     RowId   1   2   3   4   5

     男    1   0   1   0   0

     女     0   1   0   1   1

  对于婚姻状况这一列,位图索引生成三个向量,已婚为11000...,未婚为00100...,离婚为00010...

    RowId   1   2   3   4   5

    已婚    1   1   0   0   0

    未婚    0   0   1   0   1

    离婚     0   0   0   1   0

  当我们使用查询语句“select * from table where Gender=‘男’ and Marital=“未婚”?”的时候 首先取出男 向量10100...,然后取出未婚向量00100...,将两个向量做and操作,这时生成新向量00100...,可以发现 第三位为1,表示该表的第三行数据就是我们需要查询的结果。

    RowId   1   2   3   4   5

     男    1   0   1   0   0

  and 未婚     0   0   1   0   1

    结果    0   0   1   0   0

3.位图索引的适用条件

  上面讲了,位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种 类型不适合用位图索引。

  此外,位图索引适合静态数据,而不适合索引频繁更新的列。

  举个例子,有这样一个字段busy,记 录各个机器的繁忙与否,当机器忙碌时,busy为1,当机器不忙碌时,busy为0。 这个时候有人会说使用位图索引,因为busy只有两个值。好,我们使用位图索引索引busy字段!假 设用户A使用update更新某个机器的busy值,比如update table set table.busy=1 where rowid=100?,但 还没有commit,而用户B也使用update更新另一个机器的busy值,update table set table.busy=1 where rowid=12? 这个时候用户B怎么也更新不了,需要等待用户A commit。 原因:用户A更新了某个机器的busy值为1,会导致所有busy为1的机器的位图向量发生改变,因此 数据库会将busy=1的所有行锁定,只有commit之后才解锁。

资料来源:

  http://www.360doc.com/content/14/0508/15/11965070_375805586.shtml

  https://en.wikipedia.org/wiki/Bitmap_index

  http://baike.baidu.com/link?url=V3bMusSRzP6u-1bBHYDX1WeYs2OAmE9v9KKwmVAwRt_Huk7Ky2QmqXgDbdN5oaZtZgh6rPk740r8r8QN6Jdm6_

时间: 2024-10-11 18:01:15

数据库索引-位图索引的相关文章

索引——位图索引

位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表.它们可以使用较少到中等基数(不同值的数量)的列访问非常大的表.尽管位图索引最多可达30个列,但通常它们都只用于少量的列. 例如,您的表可能包含一个称为Sex的列,它有两个可能值:男和女.这个基数只为2,如果用户频繁地根据Sex列的值查询该表,这就是位图索引的基列.当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力.如果有多个可用的位图索引,O

索引(B*树索引/位图索引)

索引 功能: 1.强制实施主键约束和唯一约束 2.提高性能 (1)大表,用索引比较快,小表,全表扫描,比较快. (2)排序,如果select语句包括order by.group by.union或其它一些关键字,则必须按顺序排列行 如果有了索引,则可以按正确顺序返回行,而无须首先对它们进行排序 (3)联接表 提示: 对于使用where子句的select语句和任何update.delete或merge语句而言,索引可以起到辅助作用. 但对于Insert语句而言,索引会降低处理速度 使用B*树索引的

Atitit 索引技术--位图索引

索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作方式,数据生成均有差别. 对于8i,9i, 下面分3种方式来讨论数据的插入: a.一次插入一行,插入多行后,一次提交; b.每插入一行,提交一次; c.批量插入方式,一次提交; 对于第一种方式,观察位图索引的变化情况. a.假设插入8行相同键值的数据,如果以每行方式插入,然后一次提交,则会生成8个位图 SQL> Insert Into

oracle位图索引

以下内容主要都是关于oracle 10g位图索引,重点是存储,其它优缺点,查询机制等也略微介绍,概因为存储机制是根基.内容主要分四个部分:1)来源于http://blog.chinaunix.net/uid-20687159-id-1894992.html2)来源于http://blog.sina.com.cn/s/blog_4c6fef63010085m8.html3)来自oracle官方文档的和其它一些.  4)个人的试验,看位图索引的情况.-------------------------

于位图索引相关的执行计划

位图索引是oracle数据库里除B树索引之外的另外一种索引的类型,它主要用于数据仓库或者DSS系统.在数据仓库或DSS系统中,针对某些类型的sql,用位图索引比用B树索引要快很多,这主要是位图索引实现了快捷的按位运算的缘故. 位图索引的物理存储结构和普通B树索引的物理存储结构相似,也是按照被索引的键值列有序存储,只不过和索引键值一起存储的不再仅仅是索引键值所对应的rowid,而是变成了三部分的组合.这三部分分别为对应rowid的下限,对应rowid的上限和被压缩存储的位图(Bitmap Segm

数据库使用-oracle索引的创建和分类

数据库使用-oracle索引的创建和分类 索引是数据库中一种可选的数据结构,她通常与表或簇相关.用户可以在表的一列或数列上建立索引,以提高在此表上执行 SQL 语句的性能.就像本文档的索引可以帮助读者快速定位所需信息一样,Oracle 的索引提供了更为迅速地访问表数据的方式.正确地使用索引能够显著的减少磁盘 I/O. Oracle 提供了多种类型的索引,可以互为补充地提升查询性能: ·        平衡树索引(B-tree index) ·        平衡树簇索引(B-tree clust

Oracle 位图索引

内容简介: 1.位图索引 1.1位图索引使用注意事项; 1.2 使用位图索引; 1.3 位图索引对DML操作的影响; 2.位图连接索引 2.1 明确需求后使用位图索引; 2.1创建位图连接索引的注意事项: 1.位图索引: 1.1位图索引使用注意事项: ? 一般适用于低基数列; ? 适合数据仓库; ? 对于启用位图索引的表,应尽量减少或避免DML操作; ? 如果对一张含有多列位图索引的表进行大量DML操作,应考虑将位图索引删除,DML操作结束后重建位图索引; ? 不适用于频繁持续发生DML操作的O

位图索引

     位图索引主要针对大量相同值的列而创建的索引.(例如:性别), 位图索引相对于传统的B*树索引,在叶子节点上采用了完全不同的结构组织方式.传统B*树索引将每一行记录保存为一个叶子节点,上面记录对应的索引列取值和行rowid信息.而位图索引将每个可能的索引取值组织为一个叶子节点.每个位图索引的叶子节点上,记录着索引键值.该索引键值的起始截止rowid和一个位图向量串.从本质上将,位图索引通过一个bit位来记录一个数据行是否存在对应键值.这种方式存储数据,相对于B*Tree索引,占用的空间非

数据库使用-oracle位图索引

我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的.而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置.这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快. 位图索引的目标是为用户提供指向包含特定键值(key value