Oracle进程由服务器进程和用户进程
内存结构由系统全局区(SGA)和程序全局区(PGA)组成。一般情况下,需要保证SGA、PGA、OS使用的内存总和小于总物理RAM值
SGA包括:数据缓冲区、共享池、日志缓冲区、JAVA池和大池
1) 数据缓冲区性能调优
当数据库中的数据发生变化时,数据会被保存在数据缓冲区、日志缓冲区中。而数据缓冲区的大小是由初始化参数文件里的DB_CACHE_SIZE参数所设置的
数据缓冲区的调优目标就是尽可能让服务器进程要寻找的数据都可以再数据缓冲区里找到(有点像组成原理的cache命中率),这样就可以减少磁盘I/O操作,也代表数据缓冲区的命中率很高;同时,增加数据缓冲区的大小
一般情况下,将数据缓冲区的大小设置为可用内存的40%
SELECT 1 - (PHY.VALUE / (CUR.VALUE + CON.VALUE)) "CachHitRadio"
FROM V$SYSSTAT CUR,V$SYSSTAT CON,V$SYSSTAT PHY
WHERE CUR.NAME = 'db block gets'
AND CON.NAME = 'consistent gets'
AND PHY.NAME = 'physical reads';
(哈哈~我的机子的命中率还是蛮高的嘛)
数据缓冲区性能调优实现了对数据库缓冲区命中率的查询,一般情况下要保证其大于90%,否则就需要调整数据库缓冲区的大小
我这里米明白第一句,我觉得上述语句只是查询,何来调优?
2) 共享池性能调优
共享池主要用来存放最近执行过的SQL指令、数据字典、PL/SQL语法分析以及表的定义与权限等。共享池的大小由初始化参数文件中的SHARED_POOL_SIZE参数决定,一般大小为可用内存的10%
SELECT POOL,SUM(BYTES)
FROM V$SGASTAT
WHERE POOL = 'shared pool'
GROUP BY POOL
//查询V$SSGASTAT确认目前SGA的使用情况
SELECT NAME,POOL,BYTES
FROM V$SGASTAT
WHERE NAME = ‘free memory’;
//查询free memory的值,如果该值过大,可以考虑共享区是否过大
SELECT TO_CHAR(ROUND((1-SUM(GETMISSES)/SUM(GETS))*100,1)) ||
'%' "hit radio"
FROM V$ROWCACHE;
//查询数据字典的命中率,如果该值小于90%就需要加大共享池
关于ROUND函数的举例(下列例子均来自于网络)
ROUND(5.75,y);
如果y是负数,则对x在小数点左边的第|y|位处进行截断,例如:TRUNC(5.75, -1)=0 5.75 看成 0005.75.000 从小数点左边第一位往左边截,不是0吗
例如:ROUND(5.75)=6,表示对5.75在0位小数处进行取整,这里0位小数是7? 0位小数是没有,不是7, 7是第一位小数了。
5.75取整 就是6啊,是四舍五入了啊
ROUND(5.75, 1)=5.8,这里第1位小数是5? 不是,第一位小数是7 四舍五入就是 5.8
ROUND(5.75, -1)=10,对5.75在左边第|-1|位取整,左边第一位就是十位? 小数点左边第一位是个位,你同样看成 00005.75000, 从个位的左边开始取,并四舍五入。 个位是5 左边的十位是0, 由于5是进1的,所以是10.
3) 其他
一般情况下,JAVA池主要用于JAVA语言的开发,如果不适用JAVA,原则上其值不能小于20M,一般30M就够了
如果不设置MTS,主要用于数据库备份恢复管理器RMAN(Recovery Manager),大池在5MB到10MB之间就可以了
MTS = Multi-Threaded Server
MTS是ORACLE SERVER的一个可选的配置选择,是相对DEDICATE方式而言,它最大的优点是在以不用增加物理资源(内存)的前提下支持更多的并发的连接。
SELECT SUM(GETS),SUM(WAITS),SUM(WAITS)/SUM(GETS)
FROM V$ROLLSTAT;
//检查回滚段的占用,当SUM(WAITS)值小于SUM(GETS)的1%就不需要调整
重做日志缓冲区的调优
重做日志缓冲区的调优目标就是当服务进程每次去索取空间是都可以成功
上图的语句是检查了该动态视图中发生日志文件切换的时间,如果有责说明在线重做日志文件太小,需要加大或者多加几组在线重做日志文件
如果在告警文件中发现检查点没有执行完成,代表后台进程DBWn的动作太慢,可以开启一个以上的DBWn来执行可增加写入的效率
当归档日志文件无法写入,后者后台进程ARCn来不及执行时,代表归档日志文件的空间已满
DBWn(和DBWR是一个概念,DBWR就是database writer,就是写数据文件的进程, 后来允许多进程写data file,所以改成DBWn了):
DBWn:数据块写进程,负责将Oracle数据库缓冲区的脏缓冲写到数据文件内(脏缓冲是已经被修改,但未写入数据文件的数据)为了保证缓冲区能有空余缓冲供用户使用
从上述结果来看,本系统不需要再开启DBWn进程
通过上述查询可知LOG FILE SWITCH的次数,结果显示本系统不需要增加后台进程ARCn