常规的B树索引对包含每行记录的ROWID与索引键值。位图索引不会直接存储ROWID,每个不同的键值都有一个位图,这就是为什么创建位图索引的列要有较少的distinct值的原因。位图中的每一位映射到一个可能的ROWID,位图中每一位的特定值代表是否存在有价值的记录,因此位图中存储了关于特定行和相关的ROWID。如果ROWID的值与条件匹配在rowid的位置存储“1”,不匹配存储“0”。Oracle会压

缩位图的存储。

创建位图索引

create bitmap index index_name on table_name(columns);Oracle将创建一系列的位图,列中每个特定值都会被使用。例如,如果创建位图索引的列有'East'和'Central'两个值,那么将会为'East'和'Central'创建位图。如果是复合位图索引,那么位图将是由

任何一组可能的排列值组成。

位图索引的使用

1.列有较低的基数:较少的distinct值

2.位图索引对于包含较长where子句或聚合查询(包含sum,count或其它聚合函数)的ad hoc查询很有帮助

3.表行记录很多(比如有1,000,000行记录有10,000个distinct值)

4.对于表执行ad hoc查询很频繁

5.数据仓库环境(DSS系统)。位图索引对于联机事务处理(OLTP)不适用这是由于位图索引的锁机制造成的,只锁定单个位图的位置是不能实现的。能够被锁定的最小位图量是一个位图段,它的大小可以达到数据块的一半。改变一行记录会造成一个位图段被锁定,而实际上只改变了一行记录。当有许多update,insert或delete语句被执行时,影响会更明显。在数据仓库中当数据批量加载或更新时这种影响不是问题。

6.位图连接索引是9中引入的,通过连接可以避免在连接条件上预先创建位图索引的必要

位图索引的限制

1.不能用于RBO

2.不能用于分区表的全局索引

3.不支持联机创建或重建

4.对位图索引使用直接路径加载,"SORTED_INDEX"标记不能应用

5.位图索引不能用于引用完整性

6.位图索引不能定义为UNIQUE

7.在9i之前,当创建一个索引组织表时不能使用位图索引,从9i开始才支持。

8.对域索引不能使用bitmap

与B树索引相比的优点

1.减少了许多ad hoc查询的响应时间

2.大幅减少了存储空间

a)有少量distinct值的单列位图索引

如果位图索引是创建在一个唯一键上,它将比常规B树索引使用的空间更多。然后,如果列中有成百上千个重复值时,位图索引通常要比常规B树索引所使用的空间减少25%。位图是以压缩的格式来进行存储的。

b)在多列上创建位图索引

位图索引与B树索引相比可以大量节省存储空间。在数据库中只包含B树索引,必须对查询中所使用的列进行预测并对这些列创建一个复合B树索引。多列复合B树索引不仅需要大量的空间,还要进行排序。对于在(marital_status,region,gender)上创建的B树索引,对于只访问REGION与DENDER在前导列marital_status有太多distinct值的情况下是没有用的。为了使用索引,必须对这些列的其它组合方

式创建索引。简单来说,对于三个低基数列就有6种组合的B树索引。必须对创建那种组合的B树索引和需要的存储空间进行考虑。B树索引可以解决这种问题。位图索引可以在查询执行时进行有效的组合,因此三个小的单列位图索引可以完成6个三列B树索引所做的事情。

3.非常影响并行DML与加载

位图索引适合数据仓库程序但不适合有高并发insert,update与delete系统。在数据仓库环境中,数据通常是批量插入和更新的。索引维护操作直到每个DML操作结束才执行。

4.包含null值的记录

位图索引的使用技巧

1.对所有可能的列定义not null约束将会减少存储空间,因为这将不会为null值创建位图。

2.使用固定长度的数据类型将会减少存储空间

3.增加create_bitmap_area_size参数可以提高查询处理速度。这个参数决定了对位图创建所分配的内存大小。这个参数决定了用于合并位图从范围扫描索引执行检索所使用的内存。

位图索引的例子

MARITAL_ STATUS REGION GENDER INCOME_LEVEL

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

101 single east male bracket_1

102 married central female bracket_4

103 married west female bracket_2

104 divorced west male bracket_4

105 single central female bracket_2

106 married central female bracket_3

国灰marital_status,region,gender与income_level都是低基数列(对于matil_status与region只有三个可能的值,对于gender有两个可能的值,income_level列有四个可能的值)。在这些列上适合创建位图索引。在customer#上不适合创建位图索引,因为这个列有高基数。相反,一个唯一的B树索引将会提供最好的检索效率。

在这个例子中,region列的位图索引,它包括三个单独的位图

REGION='east' REGION='central' REGION='west' ## CUSTOMER #

1 0 0 < == 101

0 1 0 <== 102

0 0 1 <== 103

0 0 1 <== 104

0 1 0 <== 105

0 1 0 <== 106 位图中的每个条目或位关联到customer表中的单独一行记录。每一位的值依赖于表中相关行的值。例如,位REGION='east'包含一个1作为它的第一位。这是因为region='east'在表customer中的第一行存在。region='east'在其它行位为0,是因为其它行的region列不包含'east'。 下面的查询是要查询在中部或西部地区有多少已婚的客户: SELECT COUNT(*) FROM CUSTOMER WHERE MARITAL_STATUS = 'married' AND REGION IN ('central','west'); 位图索引可以非常有效的通过仅仅计算结果位图中为1的数量来进行处理。 status = 'married' region = 'central' region = 'west' 0 0 0 1 1 0 1 0 1 0 AND ( 0 OR 1 ) 0 1 0 1 1 0 0 0 0 1 1 1 ==> 2nd row

= 1 1 1 ==> 3rd row

0 AND 1 = 0

0 1 0

1 1 1 ==> last row

oracle 函数位图索引,位图索引相关推荐

  1. Oracle索引----位图索引

    位图索引(bitmap index)是从Oracle7.3版本开始引入的.目前Oracle企业版和个人版都支持位图索引,但标准版不支持.位图索引是为数据仓库/即席查询环境设计的,在此所有查询要求的数据 ...

  2. Oracle中索引位图转换的优势

    点击上方"蓝字" 关注我们,享更多干货! 第一章 Oracle索引位图转换介绍 1.1 索引位图转换 首先介绍一下索引位图转换概念: 索引位图转换是优化器对目标表上的一个或多个目标 ...

  3. oracle的函数索引怎么建,如何创建oracle函数索引

    Oracle8i的很重要的一个新特性就是增加了function-based index这种索引类型(后面简称为FBI). 有了这个特性后,Oracle DBA就可以在索引中使用函数或者表达式了.这些函 ...

  4. (五)Oracle函数 序列 约束 索引

    DECODE函数 DECODE函数基本语法 DECODE函数的语法如下:DECODE (expr, search1, result1[, search2, result2-][, default]) ...

  5. oracle 函数索引

    http://bbs.51cto.com/thread-26271-1.html 如何创建oracle函数索引 Oracle8i的很重要的一个新特性就是增加了function-based index这 ...

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

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

  7. Oracle之索引和索引碎片问题解决

    反正死锁问题你看到刚才那个结果就够了,就是他已经把死锁问题给你解决了,毕竟你只要出现死锁,毕竟有一方用户就弹出来了,退出了,直接就弹出来了,这是ORACLE系统自己去解决了,咱们继续往下看 下面咱们要 ...

  8. 查看Oracle的表中有哪些索引(用user_indexes和user_ind_columns)

    用user_indexes和user_ind_columns系统表查看已经存在的索引 对于系统中已经存在的索引我们可以通过以下的两个系统视图(user_indexes和user_ind_columns ...

  9. oracle全局索引 前缀索引_Oracle数据库中的索引详解

    一. ROWID的概念 存储 了row在数据文件中的具体位置:64位编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储 方式 SELECT ROWID, last_nam ...

最新文章

  1. 删除10亿人脸数据,Meta关闭了Facebook的人脸识别系统
  2. java 字符整数_Java整数是否等于字符?
  3. 2020 操作系统第五天复习(知识点总结)
  4. 资源分享 | 统计学最全思维导图,附下载链接
  5. ASP.NET Core 3.x控制IHostedService启动顺序浅探
  6. 我的领域驱动设计运用实例 - 领域啊领域
  7. 集成JavaFX和Swing(修订版)
  8. 【youcans 的 OpenCV 例程 200 篇】104. 运动模糊退化模型
  9. 分享Silverlight/WPF/Windows Phone一周学习导读(4月11日-4月15日)
  10. 异步任务结果显示策略
  11. java游戏代码大全_求一个简单的Java小游戏的代码
  12. vb.net 教程 11-1 打印组件 1 基础
  13. java异步编程书籍_《Java异步编程实战》(翟陆续)【摘要 书评 试读】- 京东图书...
  14. java 控制台程序_控制台应用程序开发(C# 与 Java)
  15. 模糊控制器原理笔记(附简单demo以及MATLAB相关操作)
  16. win10忘记开机密码
  17. 小程序搜索框搜索、查询(模糊搜索、关键字查询)
  18. oracle从11.0.2.4.0打PSU 11.0.2.4.8
  19. 移动云平台的基础架构之旅(一):云应用
  20. 自己的微信小程序学习笔记【1】——小程序开发工具的使用及项目文件说明

热门文章

  1. 微信小程序 省市区三级地址选择实现
  2. Album 防微信选择图片
  3. Web网页、安卓、ios、平板等的网站图标制作Favicon.ico
  4. dbeaver 设置编码_DeepFaceLab 如何开启轻量级编码器?
  5. 聊聊知乎订单系统迁移
  6. 深度学习-DRGAN对抗神经网络生成动漫头像
  7. linux开发工程师前景_linux开发工程师待遇 和你想象中的有多少差距
  8. 微信小程序“实时日志”帮你快速找到bug
  9. Viterbi algorithm
  10. linux 开机自启动 oracle