2.2.2  位图索引的结构和特征
位图索引的根块和分支块的结构与B-Tree索引完全相同,唯独叶块与B-Tree索引有所不同,其具体结构如图2-8所示。
 
■ 图2-8
假设表中的“COLOR”列值在每一个数据块中的存储顺序为“YELLOW,GREEN,RED,NULL”,如果基于这个列来创建位图索引,则需要将叶块中该列的各个值转化为位。如图2-8右侧上端所示,利用二维表来实现位图的转化,即表的行表示各个列值所对应的位,表的列表示各个行所对应的列值。
从图2-8中可以清楚地看到列值的位图转化方式。现在以该二维表中的行为单位来观察位图的具体转换方式,如图所示,只有列值与其所对应的行交叉时,位(Bit)才为1,其余均为0,例如,列值如果是“YELLOW”则结果为“1000”,列值如果是“RED”则结果为“0010”。这只是概念上的表现方式而已,实际上在查询满足查询条件的值时,从分支块出发只需要读取相应“COLOR”的叶块就可以了。如果由于OR的原因而需要读取两种颜色的叶块,则只需要按照同样的方法连续读取满足条件的两种颜色的叶块即可。
位存储时是按照“ROWID范围(Start ROWID~ End ROWID)”形式进行存储的,所以也可以认为它是一种压缩概念。通过使用键压缩(Key Compression)可以节省很多存储空间。另外,在存储列值时并不是直接对其进行存储,而是只有当出现有效值时才存储“1”,否则全部用“0”代替。
不仅如此,在执行数据查询时,由于它能够直接将满足所有查询条件的最终位转化为ROWID,所以它不像B-Tree索引那样每个索引行都有一个ROWID。尽管位图索引有其他索引所无法比拟的优势,但它也不是万能的,只有基于离散程度较低且相同值反复出现的列创建位图索引时,才能在很大程度上节约存储空间,例如,为具有1000万行数据的表创建位图索引可以确保其所占用的空间不超过10MB。
在基于离散度较差的列创建索引时,B-Tree索引为了提高索引的效率而需要将多个列结合在一起创建组合索引,而位图索引则不然。其之所以不用这么做主要是因为它支持集合运算,即从各个单独的位图索引中读取最终结果之后,再对其进行集合运算就可以获得与组合索引完全相同的效果。现在让我们来了解一下位图的集合运算。
如图2-9所示,在位的或运算中,1不论是与0还是与1进行运算,结果都是1,只有当两者都是0时结果才为0;而在与运算中,0不论是与1还是与0进行运算,结果都是0,只有当两者都是1时结果才为1。由于位运算结果其实也就是查询条件的合并,所以如果查找到了位运算的结果,也就意味着查找到了满足条件的数据行。由于位图索引支持位运算,所以就使得原来复杂的“OR”运算变得容易了很多。
 
■ 图2-9
从图2-8的右下侧可以观察到NULL值也被转化成了位。从位的角度来看,如果是NULL则为1,如果不是NULL则为0。由此可见,B-Tree无法解决的NULL问题,在位图索引中也得到了彻底解决。同样,即使有“NOT”存在,也只需要将位中的1变为0、0变为1即可,它的存在与否完全不会对位图索引的性能产生任何负面影响。
然而,当查询条件中使用的不是相等比较运算符“=”而是LIKE、BETWEEN、>、<、>=、<=等非相等比较运算符时,因为需要查询的位不仅不明确,而且查询的结果还是一个范围值,所以位图索引在此情况下就无法发挥其优势了。由于位是按照ROWID范围的形态进行存储的,如果基于修改频繁的列创建了位图索引,则不仅无形中会增加对索引空间的需求,而且还会由于块级锁(Block Level Locking)的原因而增加代价支出。还有就是,对于离散程度比较高的列而言,位图索引的优势也荡然无存。因此,位图索引在OLTP业务中很难被广泛使用。
由于这些限制条件的存在,使得位图索引主要只能被运用在数据仓库中。当然,在OLTP的统计或者汇总处理业务中位图索引也可以被灵活运用。另外,对于数据量比较少的代码表而言,在用户对其有着多样化的查询要求和频繁需要从该表中查询数据的情况下,在OLTP业务中使用位图索引虽然有着一定的负担,但勉强还是可以接受的。
在分区表中,只有在局部分区(Local)索引中才可以使用位图索引。
2.2.3  位图索引的读取
利用位图索引从表中读取数据时,首先分别读取满足单个查询条件的所有位,然后对其进行AND运算,最后筛选出满足条件的数据。如图2-10所示,“010010”就是运算后的最终位,然后将其转化为ROWID,最后使用该ROWID从表中读取对应的数据行。
 
■ 图2-10
下面是关于图2-10查询步骤的执行计划。
Execution Plan                                                                   
0   SELECT STATEMENT
1  0  SORT (AGGREGATE)
2  1    TABLE ACCESS (BY INDEX ROWID) OF 'PARTS'
3  2      BITMAP CONVERSION (TO ROWID)
4  3        BITMAP AND
5  4          BITMAP INDEX (SINGLE VALUE) OF 'COLOR_BIX'
6  4          BITMAP INDEX (SINGLE VALUE) OF 'SIZE_BIX'
如该执行计划所示,从两个位图索引中读取了满足各自条件的位,通过AND运算筛选出了满足两个查询条件的位图,然后将这些位图转换为ROWID(BITMAP CONVERSION),最后根据该ROWID从表中读取对应的数据行,并对其进行排序。表2-1详细地介绍了该执行计划中的每一个单位操作。
如果把表2-1中所介绍的单位执行计划按照不同的方式进行排列组合,就可以得到多样化的执行计划。这里首先对一些基本类型予以详细说明。为了进一步正确地把握B-Tree索引与位图索引之间的差别,首先让我们来研究一下表2-1所列举的SQL语句。
表2-1  SQL语句
 
Option    Det.option    说    明      
BITMAP
CONVERSION    TO ROWIDS    为了读取表中的数据而将位图转换为ROWID      
     FROM ROWIDS    ROWID转换为位图      
     COUNT    不需要实际列值而只读取符合条件的ROWID的个数      
BITMAP INDEX    SINGLE VALUE    在索引块中与一个键值相对应的位图的查询      
     RANGE SCAN    与一个键值相对应的多个位图的查询      
     FULL SCAN    在没有提供开始/结束值的情况下位图整体扫描      
BITMAP MERGE    -    对范围扫描所获得的几个位图进行合并      
BITMAP MINUS    -    否定型运算或者集合差运算      
BITMAP OR    -    对于两个位图集合执行或运算      
BITMAP AND    -    对于两个位图集合执行与运算      
BITMAP KEY
ITERATION    -    对于从一个表中获得的行使用指定的位图索引进行连续扫描,直到找到符合条件的位图的操作,这是在星变形连接(Star Transformation)中所表现出来的类型    
图2-11中描述的是在位图索引中使用了在B-Tree索引中所不能使用的由“NOT”所构成的查询条件,以及对其进行“OR”运算的情况。
 
从COL1的索引中读取123所对应的位图,从COL2的索引中读取ABC所对应的位图,然后对两者执行差集运算(BITMAP MINUS)。
从COL2的索引中读取列值为NULL的位图,然后再从的运算结果中减去COL2为NULL的位图。需要注意的是,在查询条件中使用某个列时,必须无条件地将所有的NULL值排除在外。因此为了满足条件COL2<>'ABC',就必须排除COL2为‘ABC’和NULL的值。
由于查询条件COL3<100要求执行范围扫描,所以在读取满足该查询条件的所有位图之后,将其合并(BITMAP MERGE)为一个位图。
对和所得到的结果进行OR运算(BITMAP OR),所得到的便是满足所有查询条件的最终位图,将该位图转换为ROWID,最后使用该ROWID读取表中的数据。

书名:海量数据库解决方案

作者:[韩]李华植 著

译者:郑保卫 盖国强 译

ISBN 978-7-121-11883-8

出版日期:2011年1月

定价:69.00元

开本:16

页码:460

宣传语

涵盖数据库专家最新核心技术的RDBMS经典书籍

包含了将代码缩减为原来的1/10倍而速度提高至原来10倍的先进方法。

揭开了关系数据库的真面目,展示了截至目前为止未能被灵活使用的新技术。

内 容 简 介

本书将整体内容分为两部分,在第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的正确理解为基础,提出对执行计划和执行速度产生最大影响的索引构建战略方案;在第2部分中主要介绍提高数据读取效率的具体战略方案,在这部分中介绍与数据读取效率相关的局部范围扫描的原理和具体应用方法,以及对被认为是提高数据库使用效率基础的表连接的所有类型予以详细说明。

《海量数据库解决方案》系列丛书深受广大读者的喜爱已经长达10年之久,在被誉为“圣经”的同时,它已经变成了数据库用户不可或缺的必读书籍。作者竭力探求能够让IT工作者在实际工作中轻松应用并掌控的巧妙方法,提供事半功倍的海量数据库解决之道。

本书适合数据库开发人员和数据库管理员等阅读。

《海量数据库解决方案》之位图索引的结构和特征相关推荐

  1. 海量数据库解决方案2011030401

    [摘抄] 基于自定义的函数索引 就是基于加工过的逻辑列所创建的索引而已,看来,在创建索引时并不是只能基于表中的物理列来创建索引.(Oracle) 其是基于函数或公式的运算结果而创建的一种B-Tree索 ...

  2. 海量数据库解决方案2011030101

    [摘抄] 索引的真正意义:索引是优化器在制定执行计划时,为了寻找最优化的路径而使用的战略要素. 类型: B-Tree索引 位图索引(Bitmap) B-Tree聚簇索引 哈希聚簇索引 反向键索引 位图 ...

  3. 海量数据库解决方案2011022101

    [摘抄] [From数据的存储结构和特征] 1.所谓的表和索引分离型的存储结构其实就是堆表,即用来存储数据的表和为了快速查找特定数据而使用的索引完全作为不同的对象来存储. 堆表最大特点:数据的存储独立 ...

  4. 数据库基础之位图索引

    位图索引用0,1来标示某条记录某个枚举字段属性的值,在多搜索码检索中,通过求与方式,达到快速定位的目的. 比方有表User id name sex education(学历) 记录 1,tom,m,初 ...

  5. 海量数据库解决方案2011031701

    [摘抄] 执行计划是指从表中读出数据并且生成查询语句所要求结果的查询路径 类型分: 扫描的执行计划 表连接的执行计划 各种运算的执行计划 特殊执行计划 扫描的基本类型: 全表扫描(Full Table ...

  6. 海量数据库解决方案2011032301

    [摘抄] Hash Join:哈希连接的最大优点就是在连接海量数据表或表中的数据存储比较分散时比较有效 Semi Join:这里是广义半连接,即由各种运算符所构成的子查询与主查询之间的连接. 笛卡尔连 ...

  7. mysql bitmap index_位图索引:原理(BitMap index)

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

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

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

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

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

  10. Oracle创建索引bitmap,Oracle编程高手箴言:位图索引(Bitmap Index)的故事

    Oracle编程高手箴言:位图索引(Bitmap Index)的故事 您如果熟悉Oracle数据库,我想您对Thomas Kyte的大名一定不会陌生.Tomas主持的asktom.oracle.com ...

最新文章

  1. 2022-2028年中国输配电设备全产业链投资分析及前景预测报告
  2. python中6 2是什么意思_python2.6中SyntaxError是什么错误?
  3. 脱口秀《娶妻当娶女博士》续集《娶妻别娶女博士》北大生物女博士的自白,爆笑加泪点...
  4. HTML 特殊符号编码对照表
  5. 如何割教育培训机构的韭菜?
  6. 08.C语言绘制系统界面
  7. sdX和hdX含义及其他安装Linux OS的总结
  8. 勤哲Excel服务器在图书出版企业管理系统中的应用
  9. 音频信号频率测试软件,音频测试信号频率详细解说
  10. px和毫米的换算_px和mm换算(px相当于多少毫米)
  11. 对概念模型的简单介绍
  12. C语言学习笔记---字符处理函数getc()和getchar()函数
  13. vue3警告[Vue warn]: Extraneous non-emits event listeners (getVal) were passed to component but could n
  14. 王道计算机组成原理课代表 - 考研计算机 第二章 数据的表示和运算 究极精华总结笔记
  15. python使用selenium进行浏览器中途调试的方法
  16. xp 开机画面【欢迎使用】四个字更改方法
  17. Windows 10如何找回显示桌面图标,一键快速回到桌面
  18. 光速入门Docker 和 Kubernetes,一起学~
  19. python快速开发app_python 使用Airtest超快速开发App爬虫
  20. 由于代理原因,联网失败的解决方法

热门文章

  1. 如何断开所有SQL Server所有的连接
  2. cocos2dx+lua注册事件函数详解 事件
  3. EOG眼电信号(眨眼检测)
  4. LinkedHashMap 底层分析
  5. 什么?云数据库也能C位出道?
  6. laravel5.2 增加Caffienate Modules,实现模块化开发
  7. 02-Swift学习笔记-元组类型
  8. CSS如何让图片垂直并水平居中等比缩放?
  9. lambda表达式和切片
  10. ICLR'22 | 审稿结果统计速览