数据缓存命中率
· 数据缓存命中率由下面四个来自V$SYSSTAT的统计值计算得来:
?nbsp; physical reads 从磁盘读取的块数;
?nbsp; physical reads direct 从磁盘读取不进入数据缓存的数据块数;
?nbsp; physical reads direct (lob) 从磁盘读取不进入数据缓存的LOB对象块数;
?nbsp; session logical reads 从数据缓存中读取的块数,包括当前读(Current, db_block_gets)和一致性读(consistent gets);
· 命中率 = 1- ((physical reads – physical reads direct – physical reads direct (lob)) / session logical reads),调整好的OLTP系统,数据缓存命中率应该在90%以上;
· 查询语句如下:
select 1 – ((physical.value – direct.value – lobs.value) / logical.value)
from v$sysstat physical,
v$sysstat direct,
v$sysstat lobs,
v$sysstat logical
where physical.name = ‘physical reads’
and direct.name = ‘physical reads direct’
and lobs.name = ‘physical reads direct (lob)’
and logical.name = ‘session logical reads’;
数据缓存等待
· free buffer inspected 用户服务器进程为了将数据从磁盘读到数据缓存,在数据缓存中查找可用的块,在找到可用块之前共查找过的缓存块数;
· free buffer waits 用户服务器进程为了将数据从磁盘读到某个脏块,需等待DBW0将这个脏块写回磁盘;
· buffer busy waits 用户服务器进程要存取某个缓存块,如果有其它会话正在使用它,必须等待其完成,可能的原因有:
?nbsp; 并行插入时表的Free lists不足引发段头等待(改用LMT可消除此影响);
?nbsp; 并发事务较多时表的InitTrans太小引发事务等待(增大表的InitTrans);
?nbsp; 回滚段不足时引发undo header等待(增加回滚段的个数);
· 一起查询时用下面的语句:
select name,value from v$sysstat where name = ‘free buffer inspected’
union
select event,total_waits from v$system_event where event in (‘free buffer waits’,’buffer busy waits’);
Statspack中存放数据缓存性能数据的位置
· Instance Efficiency Percentages (Target 100%)(实例命中率) – Buffer Hit %;
· Instance Activity Stat (实例的活动统计) – free buffer inspected, physical reads, physical reads direct, physical reads direct (lob), session logical reads;
· Buffer Pool Statistics (数据缓存统计) -- free buffer waits, buffer busy waits。
第五章 调整数据缓存 3.增大数据缓存
改进数据缓存的性能
改进数据缓存的性能有下面一些方法:增大数据缓存,用多个数据缓存池,将小表CACHE到数据缓存,绕过缓存池,正确地使用索引
增大数据缓存
· 改进数据缓存性能最简单的方法就是增大这块内存,加大数据缓存后,缓存块就可以在LRU列表上呆更多的时间,从而提高命中率,free buffer inspected, buffer busy waits, free buffer waits这三个统计值也会相应降低;
· 与数据缓存相关的初始参数有下面的一些:
?nbsp; DB_BLOCK_SIZE 主块字节数,在数据库创建时指定,不能更改,SYSTEM和TEMP表空间只能使用主块创建,后面提到的调整方法主要是针对主块缓存池来进行讨论的;
?nbsp; DB_CACHE_SIZE 指定默认缓存池的大小,不能为零,用于存放主块;
?nbsp; DB_KEEP_CACHE_SIZE 指定保持缓存池的大小,默认值为零,用于存放主块;
?nbsp; DB_RECYCLE_CACHE_SIZE 指定回收缓存池的大小,默认值为零,用于存放主块;
?nbsp; DB_nK_CACHE_SIZE 默认值为零,这些参数指定用于容纳不同于主块大小的数据块的缓存空间,创建其它表空间时可以使用与主块不同的块大小(先设置好对应参数再创建表空间,存在对应的表空间时,这些参数不能再更改回默认值),不要更改与主块大小相同的那个参数的默认值。
· 动态修改数据缓存的大小;可以用ALTER SYSTEM命令动态修改数据缓存的大小,但必须记住下面三条规则:
?nbsp; 最终生效的大小是最小粒度的整数倍;
?nbsp; 共享池,数据缓存,日志缓存之和不能大于SGA_MAX_SIZE的值;
?nbsp; DB_CACHE_SIZE不能指定为零。
· 手工更改数据缓存的大小:关闭实例,更改参数,再重启,这种方法适于同时更改SGA_MAX_SIZE;
· 确定数据缓存的合适大小:用Buffer Cache Advisory
?nbsp; 设置参数DB_CACHE_ADVISE的值为ON(设置为OFF时关掉ADVISORY,设为READY时预先给ADVISORY分配内存,但不分配CPU,以防将该参数改为ON时出现内存不足的错误);
?nbsp; 待ADVISORY运行一段时间(30分钟以上)后,再查询V$DB_CACHE_ADVICE,相关字段的意义如下表:
ü ID 缓存池编号
ü NAME 缓存池的名字
ü BLOCK_SIZE 块大小
ü ADVISE_STATUS 参数的状态:ON, OFF, READY
ü SIZE_FOR_ESTIMATE 评估缓存大小(M)
ü ESTD_PHYSICAL_READS 评估的物理读
?nbsp; 评估的物理读趋于稳定时的评估缓存就是最合适的大小。
阅读(227) | 评论(0) | 转发(0) |