位图(BitMap)索引

  前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣。说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引。

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.cnblogs.com/LBSer

oracle索引介绍之位图(bitmap)索引相关推荐

  1. oracle rowed,oracle bitmap索引内部揭密,欢迎补充

    位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树.与B树索引的区别在于叶子节点里存放索引条目的方式不同.从前面我们知道,B树索引的叶子节点里,对于表里的每个数据行 ...

  2. 索引介绍、索引原理、索引的数据结构(二叉排序树、平衡二叉树、B树、B+树)

    引入 本篇博客偏理论, 将会介绍一下知识: 索引介绍 索引原理 索引的数据结构(二叉树->平衡二叉树->B树->B+树) 聚集索引与辅助索引 MySQL索引管理 创建和删除索引的语法 ...

  3. 索引介绍及索引的分类

    目录 一.索引介绍 二.索引的分类 三.常见索引介绍 四.索引的使用 五.索引原则 一.索引介绍 MySQL官方对索引的定义为:索引(index)是帮助MySQL高校获取数据的数据结构 提取句子主干, ...

  4. oracle数据库索引介绍,SQL Server和Oracle数据库索引介绍

    SQL Server和Oracle数据库索引介绍 SQL Server 和 Oracle 数据库索引介绍1 SQL Server 中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行 ...

  5. oracle索引介绍

    一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema> ...

  6. oracle 索引介绍、作用、使用

    oracle 索引介绍.作用.使用 1.什么是索引? 索引是建立在表的一列或者多列上的辅助对象,目的是加快访问表中的数据. oracle 存储索引的结构是B*数(平衡树),而索引是由根节点.分支点和叶 ...

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

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

  8. Oracle Bitmap 索引结构、如何存储及其优势

    http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#i7495 本文内容 针对数据仓库应用程序的好处(Data Wareh ...

  9. Oracle索引梳理系列(四)- Oracle索引种类之位图索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

最新文章

  1. 管理Vim插件的插件——Vundle
  2. 网站内容才是SEO的第一要素
  3. 《C语言及程序设计》实践参考——回文日
  4. 国人主导研发的 HAWQ® 成 Apache® 顶级项目
  5. 如何选购儿童陪伴机器人(非广告)
  6. C++的静态成员函数指针
  7. c语言mergesort 参数,归并排序C语言兑现MergeSort
  8. 帮管客CRM客户管理系统 v3.6.0
  9. [转]IE首页被http://www.9798.net/篡改解决办法
  10. Emberjs学习之路(一)
  11. 每日一题/012/数学分析/求极限/拉格拉日中值定理/幂指函数求导
  12. ios状态栏字体颜色设置白色
  13. 企业供应链管理架构图
  14. c语言如何注释一段代码,如何在C语言注释一段代码?【C++培训】
  15. emos mysql_EMOS 配置及优化
  16. ALFA缺陷检测软件外观检测自学习人工智能软件
  17. Navicat Premium基本使用
  18. java计算机毕业设计游泳馆信息管理系统源程序+mysql+系统+lw文档+远程调试
  19. 设备接入ONENET(2)STM32 + ESP8266(MQTT协议)接入云 :使用 OneNET 官方麒麟座开发板例程
  20. 情人节之Python版冰墩墩

热门文章

  1. 软件开发中的角色分工
  2. 用Dynamips构建能够与真实机器通信的IPSec ***环境
  3. java爬虫(本地爬虫和网络爬虫)
  4. linux环境下的进程
  5. WPF WPF布局元素
  6. HTML如何实现带有滚动条的文本框
  7. Python办公自动化|批量生成请假条
  8. CPU分析系列--vmstat/pidstat -wt分析进程/线程上下文切换造成的性能瓶颈
  9. 百度地图-删除替换标注
  10. 3dMax 光标丢失,无法正常显示