Oracle编程高手箴言:位图索引的故事

您如果熟悉Oracle数据库,我想您对ThomasKyte的大名一定不会陌生。Tomas主持的asktom.oracle.com网站享誉Oracle界数十年,绝非幸致。最近在图书馆借到这位Oracle绝顶高手编著的《ExpertOracleDatabaseArchitecture-9iand10gprogrammingTechniquesandSolutions》,翻阅之下,果然盛名无虚,虽然说不上字字珠玑,但作者对Oracle架构的理解和实践确实已达到出神入化的境界。如果您有时间和兴趣,强烈建议您阅读这本书。这本书最大的特点是语言生动活泼,说理清楚,几乎每讲解一个原理,作者都给出了具体实例,让人读起来毫不气闷。

另外,Thomas谦逊的态度让我非常佩服,Thomas在Oracle数据库方面工作了16年,并且参与了早期Oracle版本的开发,但他仍然谦虚地说,他每天都能从Oracle文档里学到新的东西。

下面从这本书里摘录了一些精彩片段,供您欣赏,虽然不免有断章取义之嫌。

位图索引(BitmapIndex)的故事

一日,一群Java开发者找到Tom先生,说他们新开发的系统已经上线,但性能及其低下,他们问Tom先生能不能替他们看看问题到底出在什么地方。他们告诉Tom,他们的系统采用JSP+EJB+Oracle的典型三层架构,其中EJB中的SQL是由第三方工具产生的。Tom同志一听到EJB,就知道这个系统是不能采用SQL代码跟踪的方法来进行性能调优了。于是,Tom同志告诉这些心急火燎的Java开发者,你们系统的问题肯定在浏览器到数据库之间,但具体问题出在什么地方,我需要看看你们的数据库。

于是,Tom同志远程连接到他们的测试数据库(注意不是生产数据库),查看了几个动态性能视图(V$LOCK和V$SQL),最后终于发现了问题的所在。Tom同志发现他们的数据库中有一个位图索引(BitmapIndex)最为可疑,这个索引是建立在一个PROCESS_FLAG的字段上,PROCESS_FLAG字段表示该记录是否被处理了,可能值只有两个,一个是未处理(N),一个是已经处理(Y)。当记录初次插入数据库时,该字段的值为N,但其它进程读取并处理那些未处理的记录(值为N的记录)后,这个字段的值就更新为Y。

Tom就问这些Java开发者,你们为什么要在这个PROCESS_FLAG字段上建立位图索引呢?

其中有一个开发者振振有词的说,这是为了提高查找速度,一旦建立了位图索引,我们的程序就能快速找到那些数值为N的记录,然后处理。随后,他又拿出一本大部头的Oracle数据库参考手册,对Tom同志说,这书上都是这么说的,对那些数值非常少的字段,比如,我们的PROCESS_FLAG字段只有两个值,就应该建立位图索引,这难道有什么问题吗?

Tom同志微微一笑,没有直接回答。只见他打开SQLPlus,连接到他的本地Oracle实例,给这群开发者演示了下面及其简单的SQL代码。

C:\DocumentsandSettings\carlwu>sqlplusscott/tiger@carl

SQL*Plus:Release11.1.0.6.0-ProductiononWedApr2318:15:342008

Copyright(c)1982,2007,Oracle.Allrightsreserved.

Connectedto:

OracleDatabase11gEnterpriseEditionRelease11.1.0.6.0-Production

WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions

SQL>createtablet(processed_flagvarchar2(1));

Tablecreated.

SQL>createbitmapindext_idxont(processed_flag);

Indexcreated.

SQL>insertintotvalues('N');

1rowcreated.

SQL>

刚才那位振振有词的开发者不服气的说,这有什么,不是很正常吗?接着Tom又打开了一个SQLPlus窗口,并连接到本地数据库,键入下面的SQL语句,奇怪的是这条SQL并不执行,而是一直在等待。下面是这条SQL的一个截图:

‘800’)this.width=’800′;if(this.height>’600′)this.height=’600′;”border=0>

这些Java开发者看到这里,惊讶得目瞪口呆。其中一个开发者犹豫地说,好象这个位图索引只允许一个用户操作,如果其它用户想同时操作这个索引,那他必须等第一个用户的请求处理完成,并且提交之后,才能进行,如果第一个用户不提交,那么他必须一直等待。Tom点头表示赞同,然后给他们作了一番详细的解释:

Oracle数据库的位图索引(BitmapIndex)确实是针对那些数值稀疏(low-cardinality,低基数)的字段,但是还应记住的一点是,它是针对那些值不经常改变的字段的。在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。在位图索引中,如果你更新或插入其中一条数值为N的记录,那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定,这就意味着其它用户不能同时更新这些数值为N的记录,其它用户必须要等第一个用户提交后,才能获得锁,更新或插入数据。

问题找到了,修正就很简单了,Tom建议这些开发者去掉了这个位图索引,然后在PROCESS_FLAG字段上建立一个函数索引,只为那些数值为N的记录建立简单的B树索引就可以了。

这些开发者回去后,按照Tom的指点,经过一番测试,终于解决了问题。

但故事并没有到此结束,这些开发者并不满足,他们给Tom写email抱怨道,Oracle数据库真“烂”,连这个简单的位图索引问题都不能处理,你看,Oracle浪费了我们大量的时间和精力调试我们的Java程序。Tom给他们回了一封email,颇有感触地对他们说:

I have encountered issues such as this many times when an application is being moved from database A to database B. When an application that worked flawlessly in database A does not work, or works in an apparently bizarre fashion, on database B, the first thought is that database B is “bad” database. The simple truth is that database B just works differently. Neither database is wrong or “bad; they are just different. Knowing and understanding how they both work will help you immensely in dealing with these issues.

(当人们把一个应用从一种数据库迁移到另一种数据库时,他们常常抱怨同样的问题。本来这个应用程序在数据库A上运行得很好,当迁移到数据库B时,就出问题了。于是他们就认定,数据库B真烂。但事实并非如此,这只是因为数据库B的工作方式和原理不同于数据库A而已。世界上没有哪个数据库是“烂”数据库,关键是我们必须深入了解该数据库的架构和特点,这样才能避免这类问题。如果您理解位图索引的适用条件,您还会说Oracle是一个很“烂“的数据库吗?)

最后,Tom乘机建议他们,如果你们愿意,我可以给你们做一次简单的为期3天的培训。这些Java程序员听从了Tom同志的建议,经过了3天的培训后,他们对Oracle能做的事情表示吃惊,他们纷纷表示,“我真傻,原来Oracle不适合建立临时表呀,你看我的程序老是在那里删除和创建临时表。”,“要是我用了物化视图(MateralizedView),我的数据备份代码就异常简单了。”,“我还不知道connectby有这么强大的功能呢!”。

【编辑推荐】

  1. 详解Oracle的几种分页查询语句
  2. Oracle中视图的创建和处理方法
  3. Oracle DBA职责及日常工作分析

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/270544.html<

(0)
管理的头像管理
上一篇2025-05-07 21:05
下一篇 2025-05-07 21:07

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注