一 buffer cache characteristics
Buffer cache 保存从数据文件拷贝的数据块。Buffer cache是SGA的一部分,所以所有的用户能共享这些块。Server processes 把数据文件读进buffer cache。为提高性能,一次读有时候读多个块。DBWn 进程写数据从buffer cache写进数据文件。为提高性能,DBWn一次写多个块。
某一时间,buffer cache可能容纳一个块的多个拷贝。一个已存在的块的拷贝,但是对于满足server process 可能需要构建读一致拷贝从以前的镜像信息。
Buffer cache 能有四种状态:pinned,clean,free,dirty
二buffer cache sizing parameters
(1)buffer cache能够组成独立的子cache为buffer pool和不同的块大小
(2)DB_BLOCK_SIZE参数确定主要块大小,这个块大小用于主块大小和系统表空间和主buffer cache(recycle,keep,default)
(3)确定buffer cache主要块大小:
DB_CACHE_SIZE
DB_KEEP_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
二 动态buffer cache 建议参数
buffer cache advisory 特性开启和关闭统计集合为预测不同缓存大小的性能。
Buffer cache advisory 被开启,初始化参数DB_CACHE_ADVICE三个值
off,on,ready
buffer cache advisory信息被v$db_cache_advice视图收集。这个视图不同的行估计
不同的cache的物理读的性能。
v$db_cache_advice 的行估计物理读,估计实际读的数量的命中率。
三使用v$db_cache_advice
select name,size_for_estimate,estd_physical_read_factor,estd_physical_reads from v$db_cache_advice order by name,size_for_estimate;
|
SELECT size_for_estimate "Cache Size (MB)", buffers_for_estimate "Buffers", estd_physical_read_factor AS "Estd Phys Read Factor", estd_physical_reads "Estd Phys Reads" FROM v$db_cache_advice WHERE name = 'DEFAULT' AND block_size = ( SELECT value FROM v$parameter WHERE name = 'db_block_size' ) AND advice_status = 'ON';
|
三 server process 和database buffer cache
(1)服务器进程检查需要的块是否是可用的在buffer cache用hash function
(2)如果在缓存里找到需要的块,移动这个块到LRU list的MRU(most recently used)
这是一个逻辑读,因为没有实际i/o发生。剩余的步骤不会执行因为server process已经找到所需要的块。如果在buffer cache没有找到缓存,server process从数据文件读取需要的块。
(1) 如果检查点队列超出队列大小,server process发信号给DBWn提交脏数据从database buffer cache.如果server process不能找到空间缓存,发信息给DBWn提交脏数据。
(2) 找到空间的缓存区后,server从数据文件读块进入database buffer cache空间缓冲区。如果块不能读一致,则server从undo空间建立一个读一致拷贝
DBWn Porcess和Database buffer cache
(1)checkpoint queue exceeds threshold
(2)search threshold exceeded
(3)alter tablespace offline or alter tablespace begin backup
(4)drop a segment
(5)clean shutdown
四调整目标和技巧
调整目标:
(1)服务器找到数据在内存中
(2)在buffer cache没有等待
调整措施:
(1)wait event
(2)cache hit ratio
(3)v$db_cache_advice
性能记录:
(1)buffer cache performance indicators
free buffer inspected
select name,value from v$sysstat where name = ‘free buffer inspected’; |
free buffer waits buffer busy waits
select event,total_waits from v$system_event where event in (‘free buffer waits’,’buffer busy waits’); |
测量缓存命中率
SQL> SELECT 1 - (phy.value - lob.value - dir.value) 2 / ses.value "CACHE HIT RATIO" 3 FROM v$sysstat ses, v$sysstat lob, 4 v$sysstat dir, v$sysstat phy 5 WHERE ses.name = 'session logical reads' 6 AND dir.name = 'physical reads direct' 7 AND lob.name = 'physical reads direct (lob)' 8 AND phy.name = 'physical reads'; |
(2)缓存命中率不是所有
一个坏的数据库调整仍然能有一个99%或更好的命中率。
命中率仅仅是决定调整性能的一部分
命中率不能决定数据库是否被调整最佳性能
用oracle wait interface 审核引起性能瓶颈的原因
v$session_wait v$session_event v$system_event
(3)增加缓存大小指导方针
任何等待事件被调整
Sql被调整
没有不当的故障
以前增加buffer cache是有效的
低缓存命中率
(1) 计算多个缓冲池命中率
SELECT name,1 - (physical_reads / (db_block_gets + consistent_gets)) "HIT_RATIO" FROM v$buffer_pool_statistics WHERE db_block_gets + consistent_gets > 0 |
缓冲区高速缓存性能指示器
v$system_event
SELECT event, total_waits FROM v$system_event WHERE event in ('free buffer waits', 'buffer busy waits'); |
缓冲区忙等待(buffer busy waits)
数据块,如果争用表或索引(而非段头):
--使用无选择性索引检查sql语句。
--检查右侧的索引(即由多个进程在同一点插入的索引)
--考虑使用自动段空间管理或增加空闲列表,以避免多个进程试图插入同一个块。
--v$session_wait将给那些具有最频繁的块等待的块提供文件号和块号(在p*列中).然后这些被映射到各自所属的对象中。
还原头:
显示对回退段头的争用:如果没有使用自动还原管理,请添加更多的回退段。
还原块:
显示对回退段块的急用:如果没有使用自动还原管理,请考虑增加回退段大小。
空闲缓冲区等待(free buffer waits)
此事件表明服务器进程找不到空间缓冲区,并且通过写出灰数据缓冲区,来加速数据库写入器生成空闲缓冲区。灰数据缓冲区是指那些内容已被修改的缓冲区。当DBWn将块写入磁盘后,灰数据缓冲区将被释放,以便重新使用。
为了解决争用问题,DBWn必须使用缓冲区能够更快进行覆盖。要达到此目的,请检查加速写入进程的方法。本事件还指示出缓冲区调整缓存过小。检查缓冲区高速缓存命中率,以便确定高速缓存是否已经重新调整大小。
起因
在以下几种情况下,DBWn可能跟不上写入灰数据缓冲区:
I/O系统较慢。解决方法:检查文件是否均匀地分布于所有设备。如果没有效果,请使用高速磁盘,或者将那些与该问题相关的文件放入高速磁盘。
I/O系统等待资源:解决方法:检查文件是否均匀分布于所有设备。如果没有效果,请使用高速磁盘,或者将那些与该问题相关的文件放入高速磁盘。
缓冲区高速缓存太小,致使DBWn花费大量时间为服务器进程清空缓冲区。解决方法:增加缓冲区高速缓存的大小。
缓冲区高速缓存太大,致使DBWn进程不能释放足够的高速缓存缓冲区来满足需求。解决方法:减小缓冲区高速缓存大小,或者初始化更多的数据库写入器进程。
诊断空闲列表争用
v$waitstat和v$system_event动态性能视力用于诊断空闲列表争用问题。
select class,count,time from v$waitstat where class = ‘segment header’;
select event,total_waits from v$system_event where event = ‘buffer busy waits’;
标识对象:
v$session_wait包含引起“缓冲区忙等待”事件的段的文件ID和块ID。将这个视力与
dba_segments结合起来,可以标识段,并确定当前因该段而存在的空闲列表的数量。
SELECT s.segment_name,s.segment_type,s.freelists, w.WAIT_TIME,w.SECONDS_IN_WAIT,w.STATE FROM dba_segments s,v$session_wait w WHERE w.EVENT = 'buffer busy waits' AND w.P1 = s.header_file AND w.P2 = s.header_block; |
减少缓冲区忙等待(buffer busy waits)
数据块
--更改pctfree 和/或 pctused
--检查右侧的索引(即由多个进程在同一点插入的索引)
--增加initrans
--减少每个块的行数
段头
--使用空闲列表或增加空闲列表的数量
--使用空闲列表组
空闲列表块:
--增加更多的空闲列表
为了增加对象的可用空闲列表的数量,请执行以下操作:
--使用alter table 命令增加freelist数量
--将对象移动到使用自动段空间管理表空间。
自动管理空闲空间:
创建自动管理的表空间:
create tablespace bit_ykc datafile ‘$HOME/oradata/u04/bit_seg01.dbf’ size 1m extent management local segment space management auto; |
创建使用表空间自动管理的表:
create table bit_sp tablespace bit_ykc;
多个DBWn进程
--可以使用DB_WRITER_PROCESSES(DBW0到DBW9)部署多个数据库写入器进程
--这对那些使用大量cpu的smp系统十分有用
--多个进程不能与多个i/o从属同时使用
优化DBWn I/O
通过查看free buffer waits事件的值,来优化数据库写入进程