第1章 开发成功的Oracle应用 - 1.2 黑盒方法

数据库项目失败的最常见的一个原因是对数据库的实际认识不足,缺乏对所用基本工具的了解。黑盒方法是指有意让开发人员对数据库退避三舍,甚至鼓励开发人员根本不用学习数据库!在很多情况下,开发人员没有充分利用数据库。这种方法的出现,原因归结为FUD[恐惧(fear)、不确定(uncertainty)和怀疑(doubt)]。一般都认为数据“很难”,SQL、事务和数据完整性都“很难”。所以“解决方法”就是:不要卷入难题中,要知难而退。他们把数据当成一个黑盒,利用一些软件工具来生成所有代码。他们试图利用重重保护与数据库完全隔离,以避免接触这么“难”的数据库。

书上举了一个例子,Tom参与的一个项目出现了性能问题,他们的系统很多事务串行进行。经过诊断发现是这个表的PROCESSED_FLAG上有一个位图索引,PROCESSED_FLAG列只有两个值:Y和N。对于插入到表中的记录,该列值为N(表示未处理)。其他进程读取和处理这个记录时,就会把该列值从N更新为Y。这些进程要很快地找出PROCESSED_FLAG列值为N的记录,所以开发人员知道,应该对这个列建立索引。他们在别处了解到,位图索引适用于低基数(low-cardinality)列,所谓低基数列就是指这个列只有很少的可取值,所以看上去位图索引是一个很自然的选择。

不过,所有问题的根由正是这个位图索引。采用位图索引,一个键指向多行,可能数以百计甚至更多。如果更新一个位图索引键,那么这个键指向的数百条记录会与你实际更新的那一行一同被有效地锁定。

可以用一个简单的例子说明这种情况:

MUZIYU@MYDB> CREATE TABLE t
  2  (
  3    Processed_Flag VARCHAR2(1)
  4  );

表已创建。

MUZIYU@MYDB> CREATE BITMAP INDEX t_Idx ON t ( Processed_Flag );

索引已创建。

MUZIYU@MYDB> INSERT INTO t VALUES ( 'N' );

已创建 1 行。

现在,如果我们在另外一个SQL*Plus会话中执行以下命令:

MUZIYU@MYDB> INSERT INTO t VALUES ( 'N' );

这条语句就会“挂起”,直到第一个阻塞会话中发出COMMIT为止。

这个问题就是缺乏足够的了解造成的。由于不了解数据库特性(位图索引),不清楚它做些什么以及做么做,就导致这个数据库从一开始可扩缩性就很差。一旦找到问题,修正起来就很容易了,这里需要一个传统的B*Tree索引。

这个项目的问题大致如此,所以我们需要解决以下方面的问题:

  • 如何对SQL调优而不修改SQL。
  • 如何测量性能。
  • 如何查看哪里出现了瓶颈。
  • 如何建立索引,对什么建立索引。
  • 如此等等。

软件环境:Windows XP SP3+Oracle 9i R2,[ORACLE_HOME]=C:/Oracle/Ora92

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值