要得到高性能运转的Oracle数据库系统首先要做到未雨绸缪即首先要做好系统规模与容量的规划要做好这两方面的规划必须要从三方面考虑
分别是CPU利用率I/O子系统(主要是磁盘)的使用内存使用
其中CPU利用率与用户进程数量有关随着用户数量的增加用户进程数量必然增长所以在选择CPU时要优先选择那些主频高缓存区大的CPU而且要预先对用户的增长趋势做好预测为CPU的扩展做好准备
另外在任何系统中的资源都会由于使用者请求数量的增加而造成等待排队等待排队数量越多通常系统的响应速度越慢在这方面I/O子系统的表现最为明显(网络子系统与I/O子系统类似因此也有类似表现)据权威测试结果显示如果对I/O子系统中的某个资源(比如磁盘)的过多访问造成这种资源的利用率超过其自身极限的%那么就会造成对这种资源的访问等待队列中的排队数量呈几何级数增长
因此为规避这种对I/O系统的过载访问一般采用RADI阵列技术Oracle的推荐原则是使用RADI这可以做到性能与容错的完美折中但是价格上比较昂贵如果因为经济条件的限制可以使用RADI这是最为经济的一种规划但是对写操作的性能较差据成熟经验除非应用系统的读写比例为%/%否则不要使用RADI当然实际标准可能不一样而且如果I/O非常少RADI也没有问题
接下来就是内存使用问题这也是最复杂的方面因为它与操作系统Oracle数据库实例应用系统本身三方面有关
其中前两方面关系更为密切因为Oracle实例在运行时是由一系列后台进程以及这些进程所使用的内存所组成进程所使用的内存就是所谓的系统全局区SGASGA包括固有的两部分即数据库高速缓存和重做日志缓沖区还有一部分称为共享池这部分中有一些必须的池如数据字典缓存池等还有一部分可选池如大池(用于I/O读写)等这需要根据系统要提供的功能和服务来进行取捨
除了SGA还存在PGA即用户进程所使用的内存空间这部分空间的分配与使用与操作系统和Oracle本身有关因此调整和配置它们也要从这两方面考虑
在Oraclei即以后版本中可以通过设定PGA_AGGREGATE_TARGET参数来指定PGA内存大小一般的原则为用物理内存数减去SGA规划的内存数的剩余部分划分给PGASGA运行时位于操作系统的共享内存空间中而PGA位于操作系统堆栈段中因此SGA运行时不会被操作系统通过内存交换换出到磁盘而PGA有可能被换出
对于大部分的主流操作系统来说内存管理都是采用虚拟内存的页式内存管理这对Oracle性能会造成影响因此要合理调节Oracle尽量避免页式调度的发生因此我强烈推荐在单一主机上运行Oracle而且只运行Oracle剩下的就是应用系统的优化问题了这也包含两个方面
()程序代码的编写
()生产数据库的设计
首先生产数据库的结构要设计合理包括冗余字段的规划消除冗余的规划索引的建立簇的建立是否使用物化视图对大数据量的表建立分区以及优化针对数据库对象的设计(比如块尺寸的调整表的PCTUSEDPCTFREE选项的调整等)这些都要在设计时更具业务特点进行考虑或者在开发过程中根据业务变化进行修正
其次程序代码要进行合理编写比如检索语句要进量使用各种手段进行优化(如使用线索技术等对于各种优化规则请参见我的另一篇翻译文档《Oracle语句优化规则》)恰当合理的利用存储过程以及对存储过程进行优化等这些都要在开发过程中加以注意而且还包括编程语言自身(如:JavaC++等)的优化(比如使用先进算法合理使用语言选用更先进的编译技术等)这是另外的议题这里我不做讨论
总之建立一个高性能健壮的Oracle运行系统(也包括其他系统如:DB系统SQLServer系统等)是要由多方面综合因素决定的必须要在这些方面综合考虑通盘规划才可以