Atitit 索引技术--位图索引

索引在数据结构上可以分为三种B树索引、位图索引和散列索引

存储原理

编辑

位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作方式,数据生成均有差别.

对于8i,9i,

下面分3种方式来讨论数据的插入:

a.一次插入一行,插入多行后,一次提交;

b.每插入一行,提交一次;

c.批量插入方式,一次提交;

对于第一种方式,观察位图索引的变化情况.

a.假设插入8行相同键值的数据,如果以每行方式插入,然后一次提交,则会生成8个位图

SQL> Insert Into H病人挂号记录(Id,No,号别,执行人) Values(1,‘G000001‘,1,‘张1‘);

1 row inserted

基本信息

编辑

一.什么是位图索引

位图索引是一种使用位图的特殊数据库索引。

主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),

索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,

位置编码中的每一位表示键值对应的数据行的有无.一个块可能指向的是几十甚至成百上千行数据的位置.

这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快.

当根据键值查询时,可以根据起始Rowid和位图状态,快速定位数据.

当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据.

当select count(XX) 时,可以直接访问索引就快速得出统计数据.

创建语法很简单,就是在普通索引创建的语法中index前加关键字bitmap即可,例如:

create bitmap index H病人挂号记录_ix_执行人 on H病人挂号记录(执行人);

适用场合

编辑

1.位图索引Oracle数据库在7.3版本中加入的,8i,9i企业版和个人版支持,标准版不支持.

2.基于规则的优化器无法使用Bitmap索引

3.适应于有大量重复值的列查询

4.对于8i,9i版本,不适用于单行插入,适用于批量插入的数据,

因为单行插入时,相同键值,每插入8行就会生成一行索引块中的位图段,即使相同的值.

而批量插入时,相同键值只生成一个位图段.

5.由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于OLAP应用,也可以用于OLTP中主要为读操作的表.

作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王"Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak

简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴

全名::Emir Attilax Akbar bin Mahmud bin  attila bin Solomon Al Rapanui

埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门  阿尔 拉帕努伊

常用名:艾提拉(艾龙),   EMAIL:[email protected]

头衔:uke总部o2o负责人,全球网格化项目创始人,uke宗教与文化融合事务部部长,Uke部落首席大酋长,uke制度与重大会议委员会委员长,uke保安部首席大队长,uke制度检查委员会副会长,奶牛科技cto ,uke波利尼西亚区大区连锁负责人,克尔格伦群岛区连锁负责人,莱恩群岛区连锁负责人,uke汤加王国区域负责人,。布维岛和南乔治亚和南桑威奇群岛大区连锁负责人。。

转载请注明来源:attilax的专栏   http://www.cnblogs.com/attilax/

--Atiend

时间: 2024-08-25 19:20:32

Atitit 索引技术--位图索引的相关文章

B树索引和位图索引的区别!

B树索引主键和唯一性约束字段的B树索引,效率几乎和海量数据没有关系. 键值重复率低的字段比较适合使用B树索引. 位图索引键值重复率高的字段比较适合使用位图索引.count.and.or.in这些特定的操作更适合位图索引. DML操作比较多的表不适合使用位图索引. 复合索引在where条件中必须带驱动列,复合索引才会使用. 键值重复率低(DISTINCT数量多)的字段放在前面. 用实验说明为什么位图索引不适合OLTP,比较适合OLAP.即:DML操作比较多的表不适合使用位图索引. 首先创建测试表:

索引:位图索引理解

文章转载自  http://www.360doc.com/content/14/0508/15/11965070_375805586.shtml 1. 案例 有张表名为table的表,由三列组成,分别是姓名.性别和婚姻状况,其中性别只有男和女两项,婚姻状况由已婚.未婚.离婚这三项,该表共有100w个记录.现在有这样的查询:     select * from table where Gender='男' and Marital="未婚"; 姓名(Name) 性别(Gender) 婚姻状

[转帖]B树索引、位图索引和散列索引

B树索引.位图索引和散列索引 https://blog.csdn.net/huashanlunjian/article/details/84460436 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 B树索引 结构: 特点: 1.索引不存储null值. 更准确的说,单列索引不存储null值,复合索引不存储全为null的值 索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只 能全表扫描. 为什么索引列不能存Null值呢?将索引列值进

Oracle索引技术研究

Oracle索引类型 B树索引 特定类型索引 确定索引列 主键和唯一键值列的索引 外键索引 其他合适的索引列 B树索引 B树索引算法 B树是指B-tree(Balanced Tree),B树的存在是为了存储设备而设计的一种多分叉的树.B树中 每个节点至多含有m个子节点 每个非叶子节点除了根节点之外至少含有⌈m/2⌉个子节点 根节点至少含有2个子节点否则它是叶子节点 有k个子节点的非叶子节点包含k-1个键值 所有叶子节点出现在同一层 其中,m称为该B树的阶,一个3阶B树的节点的排列如同 [指针]键

Oracle索引总结(四)- Oracle索引种类之位图索引

位图索引 1.1 位图索引概述 位图索引通过位图向量,表示索引键值在表中的分布. 适用于没有大量更新操作的对象,如:OLAP数据库. 对于存在大量更新操作的索引列,不适用位图索引.因此对于OLTP并不适用. 更新位图向量时,相应位图涉及的所有数据行会被锁定,无法针对这些数据行的该索引列进行DML操作. 1.2 位图索引结构的说明 与B-tree索引的联系及区别如下: 与B-tree索引的联系:位图索引使用B-tree形式组成. 与B-tree索引的区别:位图索引的一个索引键值对应一个叶子节点.(

位图索引

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

索引——位图索引

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

Oracle - 位图索引的适用条件

位图索引的适用条件 位图索引适合只有几个固定值的列,如性别.婚姻状况.行政区等等,而身份证号这种类型不适合用位图索引. 位图索引适合静态数据,而不适合索引频繁更新的列. 举个例子,有这样一个字段busy,记录各个机器的繁忙与否,当机器忙碌时,busy为1,当机器不忙碌时,busy为0. 这个时候有人会说使用位图索引,因为busy只有两个值.好, 我们使用位图索引索引busy字段!假设用户A使用update更新某个机器的busy值,比如update table set table.busy=1 w

41.oracle索引,分析索引,索引碎片整理

概述 索引分为B树索引和位图索引.我们主要研究B树索引,B树索引如下图(图片源自网络): 索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表数据,索引能优化查询,不能优化DML,oracle自动维护索引,频繁的DML操作反而会赢钱大量的索引卫华. 如果sql语句仅仅访问被索引的列,那么数据库只需从索引中读取数据,而不会读取表:如果该语句还要访问未被索引的列,那么数据库会使用rowid来查找表中的行,通常,为检索表数据,数据库以交换方式先读取索引块,然后读取对应的表. 索引的目的是减少IO