OLTP对存储系统的影响
我们在上面分析了OLTP的语句形式不同,对CPU不同的运行压力。同样的道理,物理读乘以执行次数,就决定了存储子系统的处理能力。
在一个OLTP环境中,物理读一般都是db file sequential read决定的,也就是单块读,一个典型的OLTP系统,db file sequential read应当基本等于磁盘子系统的读IOPS。而磁盘子系统的IOPS处理能力,则是与cache命中率以及磁盘个数有很大的关系。
在我此前的一些文章中,曾经详细分析过磁盘系统IOPS能力与缓存、cache命中率的关系。请参考RAID5和RAID10,哪种RAID适合你(下),在我的这篇文章中,我们发现一个15K转速的磁盘,每秒最多能处理的iops达到150个,基本就达到该磁盘的性能极限。在cache完全不命中的情况下, 100个磁盘最多能处理的IOPS也仅仅是15000个,而实际上,考虑到一些其他不可见的损耗,大多数都达不到这个值。因此提高cache命中率对于提高存储子系统的运行效率至关重要。
OLTP数据库系统中最常用的技术就是cache技术与btree索引,通过各种有效的方式提高cache命中率,从而决定了很多语句不需要从磁盘子系统获得数据,因此能够大大的提高磁盘读取的速度。也因此,web cache与oracle data buffer对OLTP系统是很重要的。
另外,在索引使用方面,语句是越简单越好,而且一定要使用绑定变量,减少语句解析,尽量减少关联,这样的好处是执行计划较为简单稳定。
其它方面,基本不使用分区技术,MV技术,并行技术以及位图索引,因为并发量很高,批量更新可能要尽量快速提交避免阻塞的发生。
根据笔者的经验,在美国ebay电子交易网站的数据库设计中,有一个很重要的点就是,数据库只负责存放数据,业务逻辑尽量在业务层实现,因为数据库扩展是困难的,而应用服务器扩展是简单的。这种规划是非常合理的,也就是说,在高可用的OLTP环境中,数据库使用越简单的功能越好。