Oracle服务器是高度可调的数据库系统,它提供了许多特性,正确地设置和调整可以有效提高系统性能,因此,对系统进行调整是数据库管理员的主要责任。由于应用设计人员很少或根本不会给数据库管理人员提供必要的信息,因此只能采用对已有应用系统影响最小的调整方式:重新分配内存、调整磁盘I/O来提高性能。
调整内存
Oracle服务器将信息存储在两个地方:内存、磁盘。因为内存的存取比磁盘的存取快得多,为了获得最佳的性能,总是希望将数据尽可能多地放在内存供用户读取。可是系统内存资源是有限的,不可能将所有数据放在内存,因此,要在现有内存资源的基础上,通过调整内存分配来获得尽可能好的性能。调整内存的分配,实际上就是对Oracle数据库内存结构分配恰当尺寸的可用内存。
为了取得好的效果,调整要按如下顺序进行:调整操作系统、调整共享池、调整缓冲区高速缓存。由于后面调整所作的改变可能需要对前面的调整再次进行判断和调整,因此,调整的过程可能需要若干次循环。
调整操作系统
操作系统运行得好,是Oracle调整内存分配的基础,其方法如下:
减少调页或交换 过度的调页或交换必定会降低操作系统的性能。可以用操作系统提供的实用程序进行监控,如发现有过度的调页或交换,则说明系统总内存存放不下已经分配在内存中的信息。解决的办法是增加系统内存总量,或减少已经分配的内存量。
调整系统全局区(SGA) SGA是Oracle数据库存放系统信息的一块区域,由所有的服务器和客户进程共享,主要由以下四部分组成:数据高速缓冲区、字典缓冲区、重演日志缓冲区、共享SQL池。建SGA的目的是为了将数据放在内存以便快速存取,如果SGA过大内存放不下,就要被交换到磁盘,产生过度交换或调页,数据存取就快不了。在大多数系统里,过度调页的坏处比大SGA的好处对性能的影响要大得多,因此宁可SGA小些,也要保证整个SGA能被内存容下。 可利用SQL*DBA语句SHOW SGA来查看分配了多少内以及每个内部结构的大小。
该机系统内存256M,SGA大小约为115M,应用过程中不会发生调页或交换。为了提高性能,还可以在初始化参数文件INIT.ORA中添加参数 PRE_PAGE_SGA=FALSE,使得Oracle在启动Instance时将整个SGA读入内存。该设置虽然会增加Instance启动时间,但会减少Oracle在启动后达到性能峰值所用的时间。
调整共享池
调整共享池主要包括三个方面:库高速、数据字典缓存、对话信息。由于Oracle管理共享池中数据的算法,使得数据字典缓存中的数据比库高速缓存中的数据在内存中存留的时间长,因此,只要把库高速缓存调整成可以接受的命中率,就能提高数据字典缓存的命中率。
检查、调整库高速缓存 可以通过动态性能表V$LIBRARYCACHE来查询Instance启动以来所有库高速缓存的活动。
V$LIBRARYCACHE表中以下几列反映了库高速缓存在执行调用阶段的不命中:
PINS列,它的值显示在库高速缓存中执行的次数;
RELOADS列,它的值显示在执行阶段库高速缓存不命中的数目。
一般来说,库高速缓存总不命中数与总存取数之比应当接近零,本例为0.001%,说明库高速缓存命中率很高,该比率如果接近或大于1%,就应当立即采取措施来减少这种不命中。
措施一:增加初始化参数shared_pool_size的值,提高库高速缓存可用的内存数量,同时为了取得好的效果,可能还要增加初始化参数open_cursors的值,以提高对话允许的光标数。需要注意的是:为库高速缓存分配了太多的内存可能引起调页或交换。
措施二:写等价的SQL语句,尽可能让SQL语句和PL/SQL块共享一个SQL区,来减少库高速缓存的不命中。这是应用设计人员应该做到的:SQL语句或PL/SQL块的文本必须每一个字符都等价,包括大小写和空格。
检查、调整数据字典高速缓存 在应用已经运行,数据库达到了一种相对“稳定的状态”之后,可以通过动态性能表V$ROWCACHE来查询数据字典高速缓存的活动。
V$ROWCACHE表中以下几列反映了数据字典高速缓存的使用和有效性:
GETS列,它的值显示请求相应项的总数。
GETMISSES列,它的值显示造成高速缓存不命中的数据请求数。
一般来说,数据字典高速缓存总不命中数与总存取数之比应当接近零,本例为1.616%,说明数据字典高速缓存命中率比较高,该比率如果大于10%,甚至在应用过程中该比率还在增长时,就应当立即通过增加初始化参数shared_pool_size的值,来提高数据字典高速缓存可用的内存数量,从而减少这种不命中。
检查、调整对话信息占用共享池的大小 多线程服务器允许进程共享内存和连接,能支持大量用户同时访问数据库。使用多线程服务器结构时,需要将共享池分得大一些以容纳对话信息。可以通过动态性能表V$SESSTAT来查询Oracle收集对话信息使用的总内存统计。
V$SESSTAT表中session memory列,显示分配给对话的内存字节数。
max session memory列,显示分配给对话的最大内存数。
第二个结果比第一个结果大,但第一个结果能更好地估计共享内存应该多大,除非所有对话几乎在同一时间都达到最大分配。如果共享池不够,可以通过增加初始化参数shares_pool_size的值来增加。本例中共享池的大小为52428800,容纳对话信息绰绰有余。