0

0

Oracle位图索引(Bitmap Index)

php中文网

php中文网

发布时间:2016-06-07 15:15:31

|

1668人浏览过

|

来源于php中文网

原创

欢迎进入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

  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] 

Oracle位图索引(Bitmap Index)

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.7万人学习

Java 教程
Java 教程

共578课时 | 54.2万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号