ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 教你如何成为Oracle 10g OCP - 第九章 对象管理(9) - 位图(Bitmap)索引

教你如何成为Oracle 10g OCP - 第九章 对象管理(9) - 位图(Bitmap)索引

原创 Linux操作系统 作者:tolywang 时间:2011-02-18 17:34:57 0 删除 编辑

 

9.2.6  位图(Bitmap)索引


http://space.itpub.net/9842/viewspace-343286 

位图索引是另外一个索引类型,组织形式和b-tree索引相同,也是一颗平衡树,区别
在于叶子节点里存放索引条目的方式不同。前面知道,B数索引的叶子节点对于表里
的每个数据行,如果索引列的值不为空,则会为这个记录行在叶子节点中维护一个
对应的索引条目。 而位图索引则不是这样,叶子节点中存放的索引条目如下:
http://space.itpub.net/9842/viewspace-343286

位图索引非常适用于DSS及数据仓库系统,他们可以使用较少的基数(唯一键数目,
比如男和女,基数为2)列,访问非常大的表,尽管位图索引最多可以达到30个列,
但是一般都只用于少量的列。对于那些有较低基数的列要使用位图索引。位图索引
对于低基数(少量不同值)的列来说非常快,这是因为索引的大小相对于B树索引来说
小很多,因为这些索引是低基数的B树索引。


在表上建立索引后,位图索引条目上(叶子节点中)还包含表里第一条记录所对应的rowid
及最后一条记录所对应的rowid, 所以条目的最后一部分则是由多个bit位组成的bitmap,
每个bit位就对应一条记录。 格式:

key   start rowid    end rowid      bitmap
<01,     AAAAAA    ,   ZZZZZZ ,   1000100100011001001 >
<02,     AAAAAA    ,   ZZZZZZ ,   0101100100011100010 >
<03,     AAAAAA    ,   ZZZZZZ ,   0000100101101001001 >


bitmap中没有直接记录rowid, 而是记录了一个位图, 位图中的每一个bit位都对应一个rowid,
之间有转换关系的.所以用bitmap索引的时候你可以在执行计划里看到 bitmap to rowid 这样的步骤.

 


当我们发出where c1='01'这样的SQL时,oracle会搜索01所在的索引条目,然后扫描该
索引条目中的bitmap里的所有bit位。第一个bit位是1,表示第一条上的c1的值是01,
于是返回第一条记录所在的rowid(根据该索引条目里记录的start rowid加上行号得到
该记录所在的rowid), 第二个bit位为0, 则说明第二条记录上的c1值不为01,依此类推。
特别注意,如果索引列为空,也会在位图索引中记录,对应的bit位为0 ;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-687520/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13475412