文档章节

位图索引

小强斋太
 小强斋太
发布于 2016/11/09 20:05
字数 1674
阅读 0
收藏 0
点赞 0
评论 0

     位图索引主要针对大量相同值的列而创建的索引。(例如:性别), 位图索引相对于传统的B*树索引,在叶子节点上采用了完全不同的结构组织方式。传统B*树索引将每一行记录保存为一个叶子节点,上面记录对应的索引列取值和行rowid信息。而位图索引将每个可能的索引取值组织为一个叶子节点。每个位图索引的叶子节点上,记录着索引键值、该索引键值的起始截止rowid和一个位图向量串。从本质上将,位图索引通过一个bit位来记录一个数据行是否存在对应键值。这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快. 这样做对比传统的B*树索引空间节省高。而且可以借助计算机位图运算的快速特性来提高索引结果利用率。

一、位图索引的创建

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

create bitmap index emp_job_bitmap_idx on emp(job);

二、位图索引的原理

clip_image001

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

2、 位置编码中的每一位表示键值对应的数据行的有无.位数=表的总记录数

3、 所需的位图个数=索引列的不同键值多少,列的不同值越少,所需的位图就越少

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

5、 这样与B*树那样直接保存rowid的区别就在于每次都要进行rowid的换算工作。

三、例子

以EMP表为例

 1 CREATE TABLE EMP (
 2     EMPNO NUMBER (4) PRIMARY KEY,
 3     ENAME VARCHAR2 (10),
 4     JOB VARCHAR2 (9),
 5     MGR NUMBER (4),
 6     HIREDATE DATE,
 7     SAL NUMBER (7, 2),
 8     COMM NUMBER (7, 2),
 9     DEPNO NUMBER (4)
10 );

插入数据

INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,null,20);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);

select distinct "JOB" from emp

clip_image003

创建位图索引

create bitmap index emp_job_bitmap_idx on emp(job);

查询

SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB = 'SALESMAN';

上述查询语句的目的是在EMP表中查询工作岗位是SALESMAN的员工的员工号,姓名和薪水,此时假设已经在EMP表的JOB列建立了位图索引,其结构如下图所示。

clip_image005

在该索引图中,共用5 类JOB,每类JOB 对应14 个比特位(对应14 行记录),其中某行的在该列的值与JOB 值对应则使用比特1 表示,如JOB = ‘CLERK’,第一行在该列对应的值是CLERK,就用比特1表示。否则用比特0表示,其他JOB类类似。

clip_image007

SELECT EMPNO,ENAME,SAL FROM EMP WHERE JOB = 'SALESMAN'

通过位图索引扫描JOB=‘CLERK’对应的位图记录,找到值为1 的行记录,即找到需要查找数据。

clip_image009

(验证了每次都要进行rowid的换算工作)

四、位图索引与数据DML锁定

4.1 Bitmap测试

用实验说明为什么位图索引不适合OLTP,比较适合OLAP。即:DML操作比较多的表不适合使用位图索引。

以上面的EMP表为例,我们已经在该表的JOB字段建立了位图索引

Session1:

select distinct sid from v$mystat;

UPDATE EMP SET JOB='CLERK' WHERE ENAME='ALLEN';

clip_image011

Session2

select distinct sid from v$mystat;

UPDATE EMP SET JOB='SALESMAN' WHERE ENAME='SMITH';

clip_image013

select * from v$lock where sid in(10,128) order by type;
select sid,status,last_call_et,blocking_session from v$session where sid in(10,128);

可以看见10阻塞了128 。尽管他们修改的不是同一列。

clip_image015

Session1提交

clip_image017

Session2 阻塞解除,自动执行了

clip_image019

4.2 B树索引测试。

如果使用B树索引,就不存在阻塞情况了。创建同样的EMP表,使用EMPNO字段,英爱该字段为primary key,为B树索引。

Session1

SQL> select distinct sid from v$mystat;

SID

----------

10

SQL> UPDATE EMP SET EMPNO=8000 WHERE ENAME='ALLEN';

1 row updated.

SQL>

clip_image021

Session2

SQL> select distinct sid from v$mystat;

SID

----------

421

SQL> UPDATE EMP SET EMPNO=9000 WHERE ENAME='SMITH';

1 row updated.

SQL>

clip_image023

select sid,status,last_call_et,blocking_session from v$session where sid in(10,421);

两个窗口均为INACTIVE

clip_image025

五、位图索引的特点

5.1 Bitmap索引的存储空间更小

相对于B*Tree索引,位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少. bitmap的空间占用主要与以下因素相关:

       a.表的总记录数

       b.索引列的键值多少,列的不同值越少,所需的位图就越少.

5.2 Bitmap索引创建的速度更快

位图索引创建时不需要排序, B*Tree索引则在创建时需要排序,定位等操作,速度要慢得多.

5.3 Bitmap索引允许键值为空

Bitmap索引允许键值为空 B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描, 而对位图索引列进行is null查询时,则可以使用索引.

5.4 Bitmap索引对表记录的高效访问

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

当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据.

5.5 Bitmap索引对批量DML操作只需进行一次索引

由于通过位图反映数据情况,批量操作时对索引的更新速度比B*Tree索引一行一行的处理快得多.

5.6 Bitmap索引的锁机制

对于B*Tree索引,insert操作不会锁定其它会话的DML操作. 而位图索引,由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定。

原文

位图索引(Bitmap Index)——索引共用

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

本文转载自:http://www.cnblogs.com/xqzt/p/4457184.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
请教大牛们,在oracle中,对表中的某几列创建位图索引会否对插入,更新,删除数据的速度或其他方面有影响?

各位大牛们,在oracle的一个表里面(数据量2000W,正式环境会更多,并涉及分区),我在表中创建了几个位图索引,查询的速度确实提升不少,但不知道创建位图索引是否会对插入,删除,更新操作在速度上或...

鸡蛋
2011/09/16
1K
4
1Z0-051-DDL-2简单索引的创建和删除

索引具有两个功能:一是强制实施主键约束和唯一约束,二是提高性能 但是会减低DML操作性的性能。 1.1 索引的必要性 一、索引是约束机制的一部分,通过索引,可以立即(或近似立即)访问键值。...

pcghans
2016/06/29
0
0
数据库索引原理理解

以前对数据库的理解总是停留在使用的阶段,没有去研究过深层次的东西,这两天正好有空(其实也是工作需要),看了一下数据库索引的一些基础的东西,希望通过这篇博文,整理一下自己的思路。 ...

长平狐
2013/01/06
73
0
OpenGL位图和图像

  在前面的章节中,已经讲述了几何数据(点、线、多边形)绘制的有关方法,但OpenGL还有另外两种重要的数据类:一是位图,二是图像。这两种数据都是以象素矩阵形式存储,即用一个矩形数组来...

teacheryang
2010/11/19
0
0
Oracle建立位图索引

Oracle建立位图索引,在建立位图索引的时候报以下错误信息,说什么特殊功能没有启用,所使用Oracle版本不完整,求解决方案。(本人所用的是Oracle 10G)

娲城小将
2014/11/11
106
4
Greenplum中定义数据库对象之创建与管理序列、索引以及视图

创建与管理序列 序列常用于在新增记录时自动生成唯一标识符,序列的管理包括创建序列、使用序列、修改序列以及删除序列。 创建序列 使用CREATESEQUENCE命令来创建并初始化一个给定名称的单列...

fortyone41
2015/04/07
0
0
数据压缩原理与应用 图像文件的读写和转换(BMP2YUV)实验报告

一、实验原理 1.BMP文件的组成结构 BMP(全称 Bitmap )是Windows操作系统中的标准图像文件格式 ,可以分成两类:设备相关位图(DDB )和设备无关位图( DIB),使用非常广。它采用位映射存...

zgyggy
2017/03/22
0
0
Oracle中的索引详解

一、 ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, lastname FROM hr.employees WHERE departmentid ...

crazyinsomnia
2010/02/24
85.2K
3
bitmap图像介绍

典型的BMP图像文件由四部分组成:   1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;   2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信...

技术小胖子
2017/11/14
0
0
ORACLE SQL总结三:DDL语句

5、DDL语句 5.1 Enable/Disable/Validate/Novalidate 组合特性说明: 是否要求满足约束 Validate Novalidate 已有记录 新增/修改记录 已有记录 新增/修改记录 Enable Yes Yes No Yes Disabl...

yeyelei
2012/07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaEE——JavaScript

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 JavaScript 内置对象 String对象方法: date对象...

凯哥学堂
10分钟前
0
0
Git 远程代码回滚master

方式一(推荐): git revert commit-id 方式二(不推荐):不推荐原因:推送到线上后,其它开发人员需要重新clone git reset --hard commit-id git push origin HEAD --force...

浮躁的码农
10分钟前
0
0
Elasticesearch学习(7)—— ES查询与Java API的对应关系

1、普通查询 类型 ES查询语句 Java查询实现 结果 查询格式 { "query": { "bool": { "must": [], "must_not": [], "should": [], "filter": [] } }, "from": 0, "size": 10, "sort": [] } Que......

叶枫啦啦
11分钟前
4
0
getElementsByClassName()与getElementById()区别

1.document.getElementsByClassName() 返回的是数组 使用:document.getElementsByClassName("className")[0].innerText='具体内容' 2.document.getElementById() 返回的是单个元素 使用:d......

botkenni
21分钟前
0
0
MyBatis入门

一、安装 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency> 二、从 XML 中构建 SqlSessionFactory String r......

一个yuanbeth
22分钟前
0
0
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
25分钟前
0
0
【转】使用Lombok来优雅的编码

前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。 正文 添加依赖 在 pom.xml 文件中添加相关依赖:...

HAVENT
27分钟前
0
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
34分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
44分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部