欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树。与B树索引的区别在于叶子节点里存放索引条目的方式不同。从前面我们知道,B树索引的叶子节点里,对于表里的每

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树。与B树索引的区别在于叶子节点里存放索引条目的方式不同。从前面我们知道,B树索引的叶子节点里,对于表里的每个数据行,如果被索引列的值不为空的,则会为该记录行在叶子节点里维护一个对应的索引条目。

而位图索引则不是这样,其叶子节点里存放的索引条目如下图所示。

假设某个表T里所有的记录在列C1上只具有三个值:01、02和03。在表T的C1列上创建位图索引以后,则叶子节点的内容如图9-14所示。可以看到,位图索引只有三个索引条目,也就是每个C1列的值对应一个索引条目。位图索引条目上还包含表里第一条记录所对应的ROWID以及最后一条记录所对应的ROWID。索引条目的最后一部分则是由多个bit位所组成的bitmap,每个bit位就对应一条记录。

位图索引的结构

当发出where c1=’01’这样的SQL语句时,oracle会去搜索01所在的索引条目,然后扫描该索引条目中的bitmap里所有的bit位。第一个bit位为1,则说明第一条记录上的C1值为01,于是返回第一条记录所在的ROWID(根据该索引条目里记录的start ROWID加上行号得到该记录所在的ROWID)。第二个bit位为0,则说明第二条记录上的C1值不为01,依此类推。另外,如果索引列为空,也会在位图索引里记录,也就是将对应的bit位设置为0即可。

如果索引列上不同值的个数比较少的时候,比如对于性别列(男或女)等,则使用位图索引会比较好,因为它对空间的占用非常少(因为都是用bit位来表示表里的数据行),从而在扫描索引的时候,扫描的索引块的个数也比较少。可以试想一下,如果在列的不同值非常多的列上,比如主键列上,创建位图索引,则产生的索引条目就等于表里记录的条数,同时每个索引条目里的bitmap里,只有一个1,其它都是0。这样还不如B树索引的效率高。

如果被索引的列经常被更新的话,则不适合使用位图索引。因为当更新位图所在的列时,由于要在不同的索引条目之间修改bit位,比如将第一条记录从01变为02,则必须将01所在的索引条目的第一个bit位改为0,再将02所在的索引条目的第一个bit位改为1。因此,在更新索引条目的过程中,会锁定位图索引里多个索引条目。也就是同时只能有一个用户能够更新表T,从而降低了并发性。

位图索引比较适合用在数据仓库系统里,不适合用在OLTP系统里。

SQL> create table t_bitmap_test as

2 select rownum as id,trunc(dbms_random.value(1,4)) as bitcol

3 from dba_objects where rownum<=20;

SQL> select * from t_bitmap_test;

ID BITCOL

---------- ----------

1 3

2 2

3 1

4 3

5 3

6 1

7 1

8 2

9 3

10 2

11 3

12 1

13 1

14 3

15 2

16 2

17 3

18 2

19 1

20 3

SQL> connect hr/hr

已连接。

SQL> alter session set events '10608 trace name context forever, level 10';

会话已更改。

SQL> create bitmap index idx_t_bitmap_test on t_bitmap_test(bitcol);

索引已创建。

SQL> alter session set events '10608 trace name context off';

会话已更改。

SQL> select object_id from user_objects where object_name='IDX_T_BITMAP_TEST';

OBJECT_ID

----------

24499

SQL> alter session set events 'immediate trace name TREEDUMP level 24499';

会话已更改。

10608事件用来跟踪创建bitmap索引的过程。而TREEDUMP则用来转储索引的树状结构。打开转储出来的文件:

*** SESSION ID:(7.13) 2008-06-10 14:33:46.000

qerbiARwo: bitmap size is 8168

qerbiIPI default pctfree=10

qerbiIPI length=0

qerbiAllocate pfree=127 space=8168

qerbiStart first start

qerbiRop: rid=00c01ce4.0000, new=Y , key: (2): c1 04

qerbiCmpSz notfound pctfree=10

qerbiCmpSz adjblksize=7351 length=0

qerbiRop keysize=4 maxbm=3531

kdibcoinit(3116714): srid=00c01ce4.0000

qerbiRop: rid=00c01ce4.0001, new=Y , key: (2): c1 03

kdibcoinit(3116698): srid=00c01ce4.0001

qerbiRop: rid=00c01ce4.0002, new=Y , key: (2): c1 02

kdibcoinit(311661c): srid=00c01ce4.0002

qerbiRop: rid=00c01ce4.0003, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0004, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0005, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.0006, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.0007, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.0008, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0009, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.000a, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.000b, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.000c, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.000d, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.000e, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.000f, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.0010, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0011, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.0012, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.0013, new=N, key: (2): c1 04

kdibcoend(3116714): erid=00c01ce4.0017status=3

[1] [2] [3]

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql bitmap位图索引_Oracle位图索引(Bitmap Index)相关推荐

  1. mysql为什么要重建索引_Oracle 重建索引的必要性

    索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是O 索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有 ...

  2. oracle 建分区索引_Oracle分区索引

    索引与表类似,也可以分区: 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全局分区索引) 下面就来详细解 ...

  3. oracle全局索引 前缀索引_Oracle 分区索引介绍和实例演示

    --环境 SQL> select * from v$version where rownum<2; BANNER ------------------------------------- ...

  4. oracle位图索引和普通索引区别,【索引】Bitmap位图索引与普通的B-Tree索引锁的比较...

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的"高昂代价".位图索引会带来"位图段级锁",实际使用过程一定要充分了解不同索引带来的锁代价 ...

  5. mysql实现位图索引_位图索引,数据库索引浅浅的学习

    位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为ta ...

  6. 位图索引,数据库索引浅浅的学习

    摘自http://www.cnblogs.com/LBSer/p/3322630.html 位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧, ...

  7. linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图

    0. 文件系统和图书馆 在linux上操作文件,和在图书馆借书是非常相似的. 硬盘上的文件系统,好比图书馆的书架:而vfs则是图书馆的管理系统. 内核的工作: 1. 维护一个文件的目录树(dentry ...

  8. B树索引和位图索引介绍

    一  前言:? ROWID:包含键值的行的行ID,(查找块的最快方法,类似于门牌号)? 因为所有行属于同一个段,所以要使用受限的ROWID 指向表行 索引是数据库为了提高查询效率提供的一种冗余结构,保 ...

  9. Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——2-5

    --理解适当使用每个索引对性能的影响 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--1-5 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--2-5 ...

最新文章

  1. java Random.nextInt()方法
  2. SpringSide 3 中的 Struts 2
  3. android 原生砸金蛋 动画,C4D-砸金蛋动画效果制作
  4. redis session java获取attribute_redis里的数据结构
  5. asset文件夹路径 unity_我们来捣鼓一下Unity的平台跳跃Microgame
  6. 【基于Python】 - 人工智能机器学习深度学习数据分析 - 常见问题,常用的套路与操作(持续更新)
  7. TCP层的分段和IP层的分片之间的关系 MTU和MSS之间的关系
  8. C代码编译过程,cmakelist基础步骤
  9. 高德地图android显示级别指定位置,获取地图中心点/级别
  10. 都是山寨惹的祸 最邪恶安卓恶意程序肆虐网络
  11. Epub,Mobi,Azw3电子书格式的区别,windows上有什么好用的epub阅读器
  12. 三轴、六轴、九轴传感器
  13. 红楼梦诗词全集---留一份吧,太珍贵了!!
  14. 【webpack5配置favicon.ico】
  15. Javaweb项目报告
  16. 《基础会计学》期末模拟试题及答案
  17. Java基础学习总结(35)——Java正则表达式详解
  18. COJ 1163: 寒衣调
  19. 未能加载文件或程序集“Newtonsoft.Json,Version = 13.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed“..
  20. LeetCode--597. 好友申请 I :总体通过率

热门文章

  1. 北京某互联网公司鼓励员工尽量住公司
  2. Try kolla-ansible (by quqi99)
  3. python对文件的追加写模式_Python中文件的读写、写读和追加写读三种模式的特点...
  4. java数据结构-JCF
  5. 2021neuq暑期集训2部分题解(AKE)
  6. html网页制作一个人多久,一个人,一个站,我的真实感受
  7. VC6中调用.dll文件中的函数——傻瓜式教程
  8. Simulink建立Rayleigh信道——Fading和AWGN模块学习笔记
  9. 配置org.springframework.scheduling.quartz.CronTriggerBean
  10. python jsonpath_Python_JsonPath