热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

OracleBitmapIndex

ORACLE的bitmap索引,我们用的很少。在我们的常理认识当中,我们用的最多就是类似性别,类型这种属性的字段,因为他们字段的种类

ORACLE的bitmap索引,我们用的很少。在我们的常理认识当中,我们用的最多就是类似性别,类型这种属性的字段,因为他们字段的种类

Oracle的bitmap索引,我们用的很少。在我们的常理认识当中,我们用的最多就是类似性别,类型这种属性的字段,因为他们字段的种类很少。其实 BITMAP还是有很多优势以及一些特性的。

首先在传统的INDEX里,我们在索引的存储上,一般是分为:header+index length+index value+rowid组成。如图:

2010-05-24_142946

bitmap的存储结果相对来说,复杂一点。 bitmap 不存储rowid。那么rowid存储在哪里呢?答:每一个bitmap的头部,都存储了rowid的启示位置与结束位置。ORACLE通过自己的内部算 法,算出来相应的ROWID。
位图中的每一位,都记录是否有值。
如表的记录是这样存储的:

row-value

male

female

female

male

那么对应的bitmap则是这样存储的:

rowid的启示位置与结束位置 rowid的启示位置与结束位置

male female

1 0

0 1

0 1

1 0

由 此可见,存储的空间大大的节省了,另外带来的收益就是扫描的BLOCK也大大减少了。

如果查找性别是male的数据,ORACLE只会去 搜索MALE这一列,然后是1的记录,返回即可。

如果是针对BITMAP字段本身做OR,AND这样的查询,那么ORACLE会在 BITMAP索引内部,先做一次判断,找出符合结果的,再去计算ROWID,,最后给出相应的VALUE,示意图如下:

dwhsg093

bitmap join index
bitmap join index,它的特点就是将多张表的JOIN结果,存储在一个索引里面,然后使用BITMAP的形式进行存储。图难画了,请见谅,改天有空的时候,再把图 补上。这个对于类似DW那样的多表join效率提高很明显。
我今天做了一个测试,是用3张表join来做的,原来的SQL是这样的:
test@DB> select wt_cust.company_name,wt_cust.gmt_create
2 from wt_cust,wt_CUST_EXT ,wt_CUST_BOOK
3 where wt_cust.id=wt_CUST_EXT.Cust_Id
4 and wt_CUST_BOOK.Cust_Id=wt_cust.id;

58 rows selected.

Elapsed: 00:00:00.01

Execution Plan
———————————————————-

—————————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
—————————————————————————————————-
| 0 | SELECT STATEMENT | | 54 | 2484 | 179 (0)|
| 1 | NESTED LOOPS | | 54 | 2484 | 179 (0)|
| 2 | NESTED LOOPS | | 177 | 7257 | 179 (0)|
| 3 | INDEX FULL SCAN | wt_CUST_BOOK_UK | 177 | 1062 | 1 (0)|
| 4 | TABLE ACCESS BY INDEX ROWID| wt_CUST | 1 | 35 | 2 (0)|
|* 5 | INDEX UNIQUE SCAN | wt_CUST_PK | 1 | | 1 (0)|
|* 6 | INDEX RANGE SCAN | wt_CUST_EXT_CID_IND | 1 | 5 | 0 (0)|

—————————————————————————————————-

一 个3表join,效率很差。如果我们创建BITMAP JOIN INDEX则可以避免这种情况的发生:
test@DB>CREATE BITMAP INDEX cust_wt_test
2 ON wt_cust(wt_cust.company_name)
3 FROM wt_cust,wt_CUST_EXT ,wt_CUST_BOOK
4 WHERE wt_cust.id=wt_CUST_EXT.Cust_Id
5 and wt_CUST_BOOK.Cust_Id=wt_cust.id
6 tablespace test_ind ;

Index created.

Elapsed: 00:00:00.08
再来看看SQL的执行计划:
xx@DB>select wt_cust.company_name,wt_cust.gmt_create
2 from wt_cust,wt_CUST_EXT ,wt_CUST_BOOK
3 where wt_cust.id=wt_CUST_EXT.Cust_Id
4 and wt_CUST_BOOK.Cust_Id=wt_cust.id;

58 rows selected.

Elapsed: 00:00:00.00

Execution Plan
———————————————————-

—————————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
—————————————————————————————
| 0 | SELECT STATEMENT | | 1834K| 61M| 219K (1)|
| 1 | TABLE ACCESS BY INDEX ROWID | wt_CUST | 1834K| 61M| 219K (1)|
| 2 | BITMAP CONVERSION TO ROWIDS| | | | |
| 3 | BITMAP INDEX FULL SCAN | CUST_WT_TEST | | | |
—————————————————————————————

请 着重注意红色部分。逻辑读大大降低!!
BTW:
我觉得我们除了传统的NESTLOOP,MERGE JOIN,HASH JOIN。这样看来又多了一种优化JOIN的方式。

总结:
bitmap我们可能平时使用的不多,但是觉得它在特殊的应用场景,还 是有优势的。bitmap join index更是一种多表JOIN的新方式,很有意思。

linux

推荐阅读
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • 本文探讨了MySQL中的死锁现象及其监控方法,并介绍了如何通过配置和SQL语句调整来优化数据库性能。同时,还讲解了慢查询日志的配置与分析技巧。 ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 最适合初学者的编程语言
    本文探讨了适合编程新手的最佳语言选择,包括Python、JavaScript等易于上手且功能强大的语言,以及如何通过有效的学习方法提高编程技能。 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 在Android应用开发过程中,开发者经常遇到诸如CPU使用率过高、内存泄漏等问题。本文将介绍几种常用的命令及其应用场景,帮助开发者有效定位并解决问题。 ... [详细]
  • 在中标麒麟操作系统上部署达梦数据库及导入SQL文件
    本文档详细介绍了如何在中标麒麟操作系统上安装达梦数据库,并提供了导入SQL文件的具体步骤。首先,检查系统的发行版和内核版本,接着创建必要的用户和用户组,规划数据库安装路径,挂载安装介质,调整系统限制以确保数据库的正常运行,最后通过图形界面完成数据库的安装。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
author-avatar
mobiledu2502902037
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有