索引:位图索引理解

文章转载自  http://www.360doc.com/content/14/0508/15/11965070_375805586.shtml

1. 案例

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


姓名(Name)


性别(Gender)


婚姻状况(Marital)


张三



已婚


李四



已婚


王五



未婚


赵六



离婚


孙七



未婚


...


...


...

1)不使用索引

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

2)B树索引

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

2. 位图索引出马

位图索引创建了之后,生成是位图数据可以这么理解,比如,男女两种,然后一共八条数据,那么就生产两个字符串,一个代表男,一个代表女,字符串长度为数据的总数量,字符串的值:第一位(如果第一条数据是男那么就是1,如果不是就0),第二位,第三位,往后都是这样。由此就生成了长度为总数量,只包含01的字符串,通过这个字符串就能知道第几条数据是男,第几条不是男,同理,另外一条代表女的字符串也一样,是女的就1,不是女的就0。

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

对于性别这个列,位图索引形成两个向量,男向量为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之后才解锁。

时间: 2024-06-20 05:53:44

索引:位图索引理解的相关文章

索引——位图索引

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

数据库索引-位图索引

在学习hive的时候遇到了位图索引,查了查资料.现则很难管理如下,算是个基础知识的了解吧. 一:概念介绍: 百度百科: 位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置. 当然百度百科你们懂的...来看看wiki的吧 维基百科: Bitmap indexes have traditionally bee

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

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

位图索引

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

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

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

Oracle中B-TREE索引的深入理解(转载)

索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书,其中书的内容就相当于表里的数据,而书前面的目录就相当于该表的索引.同时,通常情况下,索引所占用的磁盘空间要比表要小的多,其主要作用是为了加快对数据的搜索速度,也可以用来保证数据的唯一性.但是,索引作为一种可选的数据结构,你可以选择为某个表里的创建索引,也可以不创建.这是因为一旦创建了索引,就意味着o

【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”.位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况. 1.为比较区别,创建两种索引类型的测试表1)在表t_bitmap上创建位图索引[email protected]> create table t_bitmap (id number(10), name varchar2(10),sex varchar2(1)); Table created. [email protected]>