Oracle性能调整(一)——基本参数调整一、操作系统参数交换区是Oracle的一项基本的要求。
可以根据Oracle的发行要求来确定。
一般交换区大小的要求是该服务器内存的2倍至4倍之间,建议是内存的4倍Note2:oracle 文件设置当服务器平台已完成操作系统的安装后,就应该开始认真的考虑下面的问题:A、是否采用裸设备实际应用的生产系统基本都是采用裸设备,使用裸设备对于读写频繁的数据库应用来说,可以极大地提高数据库系统的性能。
B、安装点的考虑Oracle的安装点就是指数据文件、日志文件和控制文件的安置路径,为了使系统在以后运行性能达到优化,建议将数据文件、日志文件和控制文件的安置路径与数据库系统存放在不同的路径上。
最好将数据文件、日志文件和控制文件分别存放在不同的路径。
C、SYSTEM表空间对应数据文件在自定义安装会话中,建议你根据需要设置system表空间所对应的数据文件的大小。
一般要设置比默认值的2倍。
该数据文件的大小最好是在300MB至500MB间。
因为数据文件太小不利于系统的运行。
D、临时表空间对应的数据文件临时表空间对应的数据文件可以根据将来系统存放的应用的处理情况来定。
比如系统将来可能要经常进程排序处理,则需要设置较大的临时表空间,也可能需要再建立新的临时表空间。
这里建议临时表空间的数据文件在100MB至300MB左右。
E、回滚段表空间对应的数据文件回滚表空间都是系统管理,初始值也是根据系统事务量预估计的值,实际到运行阶段如果系统常出现ORA-01555错误的时候,可能就需要增加回滚表空间的大小。
F、日志文件的大小日志文件的大小对于Oracle系统的运行也是相当重要。
默认值是太小。
实际根据事务繁忙预估计日志大小,没有固定的具体值范围,建议重做日志切换时间不能过短也不能过长,一般在20-40分钟左右。
该参数可以在系统运行期间根据数据库系统日志切换时间重新调整,控制文件的大小。
G、数据库块的大小如果你的应用系统是OLTP的话,可以采用较小的数据库块。
如果是DSS类型的应用系统,则可以设置较大的数据库块,目前Oracle产品所允许的数据库块可以是2KB至64KB之间。
无论你选择较大的块或较小的块,它的值都必须是2的整数倍,比如2048,4096,8192等。
但需要注意的是,如果操作系统为64位,则可选择较大的块。
H、字符集的选择字符集是Oracle系统专门支持的一项技术。
详细请参考另外的章节。
一般不要与另外的已经存放的Oracle系统的字符集产生冲突即可。
但如果你的环境是一个新的平台,不需要与其它平台进行数据交换的话,建议选择默认的字符集。
这样可以利于将来的修改。
二、数据库启动参数(SGA)Note1:默认的SGA是PGA的3倍SGA+PGA=PHY_MEM×60%得到最好的性能查看:sql> show parameters sga_max_size修改:sql>alter system set sga_max_size = 30000000;重启数据库生效Note2:select sum(pinhits)/sum(pins)*100 "hit radio" from v$librarycache;假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存Note3:sql> select value from v$sysstat where name ='physical reads';sql> select value from v$sysstat where name ='physical reads direct';sql> select value from v$sysstat where name ='physical reads direct (lob)';sql> select value from v$sysstat where name ='consistent gets';sql> select value from v$sysstat where name = 'db block gets';令x = physical reads direct + physical reads direct (lob)命中率=100 - ( physical reads - x) / (consistent gets + db block gets - x)*100通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区Note4:对应的参数是log_buffer,缺省值与OS相关,一般是500K。
检查v$session_wait中是否存在log buffer wait,v$sysstat中是否存在redo buffer allocation retriesselect name,value from v$sysstat where name in('redo entries','redo buffer allocation retries');假如redo buffer allocation retries/ redo entries 的比例超过1%我们就可以考虑增大log_buffer。
A、检查是否存在log buffer wait:Select * from v$session_wait where event='log buffer wait';如果出现等待,一可以增加log_buffer的大小,也可以通过将log 文件移到访问速度更快的磁盘来解决。
B、Select name,value from v$sysstat where name in ('redo buffer allocation retries','redo entries')Redo buffer allocation retries接近0,小于redo entries 的1%,如果一直在增长,表明进程已经不得不等待redo buffer的空间。
如果Redo buffer allocation retries过大,增加log_buffer的值。
C、检查日志文件上是否存在磁盘IO竞争现象Select event,total_waits,time_waited,average_wait from v$system_event where event like 'log file switch completion%';如果存在竞争,可以考虑将log文件转移到独立的、更快的存储设备上或增大log文件。
D、检查点的设置是否合理检查alert.log文件中,是否存在‘checkpoint not complete’;Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch (check%’;如果存在等待,调整log_checkpoint_interval、log_checkpoint_timeout的设置。
E、检查log archiver的工作Select event,total_waits,time_waited,average_wait from v$system_event where event like ‘log file switch (arch%’;如果存在等待,检查保存归档日志的存储设备是否已满,增加日志文件组,调整log_archiver_max_processes。
F、DB_block_checksum=trueDB_block_checksum=true,因此增加了性能负担。
(为了保证数据的一致性,oracle的写数据的时候加一个checksum在block上,在读数据的时候对checksum进行验证)Note5:通过如下语句查看数据库并发量:select count(*) from v$session where status='ACTIVE';SQL> show parameter processesSQL> show parameter sessions如果上面语句的值和processes,sessions参数的值非常接近了,说明需要扩大processes,sessions数量。
processes,sessions两者的关系:sessions=(1.1*process+5)SQL> alter system set processes=300 scope=spfile;SQL> alter system set sessions=300 scope=spfile;SQL> shutdown immediateSQL> startup在Unix或linux中,调整processes还要调整semmns(系统的信号量参数),因为每个processes会占用一个信号量。
semmni,semmns,semmsl要加大,至少要比processes大18 ;SEMMNI(10,10000;150):指定在核心中信号识别的数量。
这是可以在任意给定时间被激活的唯一信号设置数量。
缺省值是150。
最大值由系统自动调整产生。
SEMMSL(25,300;150):指定每个信号识别中信号量的最大值。
缺省值是25。
SEMMNS除最大db外的所有db 的PROCESSES之和+2*最大db的PROCESSES+10*实例数。
如3个实例进程数分别为100、100、200,则=(100+100)+2*200+10*3=630SEMOPM(10,20;10):指定在每个系统调用semop中能够被执行的信号操作量的最大值。
缺省值是10。
SHMMAX×物理内存字节数SHMMNI(10,1000;100):指定了系统范围内共享内存标识的最大值。
SHMSEG(6,15;6):指定了与每个进程相关连的共享内存块(或标识)的数量。
缺省值是6。
与每个进程相关连的共享内存块的最大值与进程拥有的未使用空间有关。
因此,尽管一个进程拥有少于SHMSEG数值的共享内存块,它也有可能因为其有限的空间而不能与其它进程相联系。
Note6:select name,value from v$sysstat where name like '%sort%';假如我们发现sorts (disk)/ (sorts (memory)+ sorts (disk))的比例过高,则通常意味着sort_area_size部分内存较小,可考虑调整相应的参数。