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