让Oracle跑得更快:Oracle 10g性能分析与优化思路
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.1 OLTP数据库

OLAP和OLTP是两类完全不同的系统,对数据库的要求也截然不同。通常来讲,OLTP(在线事务处理系统)的用户并发数都很多,但他们只对数据库做很小的操作,数据库侧重于对用户操作的快速响应,这是对数据库最重要的性能要求。我清楚地记得在2008年的时候,某个门票在线销售系统允许人们通过网络购买门票,这是一个典型的OLTP系统。我当时还想尝试去买一张,结果是还没等到我去买,就听说系统瘫痪了。我想,应该是在线购票的用户数太多吧,导致数据库(我不太确定,也可能是中间件系统)没有办法处理大量的连接,从而导致了系统崩溃。这真是一个惨痛的教训,它用事实告诉我们,对于一个系统,特别是非常重要的系统,一些前瞻性的预测和系统的压力测试有多么的重要。

对于一个OLTP系统来说,数据库内存设计显得很重要,如果数据都可以在内存中处理,那么数据库的性能无疑会提高很多。我知道有些对处理速度要求很高的系统,已经采用了一些内存数据库,比如Oracle的Times Ten。

内存的设计通常是通过调整Oracle和内存相关的初始化参数来实现的,比较重要的几个是内存相关的参数,包括SGA的大小(Data Buffer,Shared Pool)、PGA大小(排序区,Hash区等)等,这些参数在一个OLTP系统里显得至关重要,OLTP系统是一个数据块变化非常频繁、SQL语句提交非常频繁的系统。对于数据块来说,应尽可能让数据块保存在内存当中,对于SQL来说,尽可能使用变量绑定技术来达到SQL的重用,减少物理I/O和重复的SQL解析,能极大地改善数据库的性能。

关于一些初始化参数的设定的问题,我认为,这里绝没有一个确定的标准,这和每个数据库上运行的业务直接相关,能够确定这些参数值的唯一方法就是测试,先给这些参数设定一个经验值,然后通过搭建测试环境对数据库进行测试,通过一些性能报告(比如AWR或者Staspack报告)作为依据,不断地调整这些参数值,以达到最佳的性能。

除了内存、没有绑定变量的SQL会对OLTP数据库造成极大的性能影响之外,还有一些因素也会导致数据库的性能下降,比如热块(hot block)的问题,当一个块被多个用户同时读取的时候,Oracle为了维护数据的一致性,需要使用一种称为Latch的东西来串行化用户的操作。当一个用户获得了这个Latch后,其他的用户就只能被迫等待。获取这个数据块的用户越多,等待就越明显,就造成了这种热块问题。这种热块可能是数据块,也可能是回滚段块。对于数据块来讲,通常是数据块上的数据分布不均匀导致,如果是索引的数据块,可以考虑创建反向索引来达到重新分布数据的目的,对于回滚段数据块,可以适当多增加几个回滚段来避免这种争用(热块部分在后面有专门的章节讨论)。