turning the buffer cache

turning the buffer cache

  buffer cache characteristics

  Buffer cache 保存从数据文件拷贝的数据块。Buffer cacheSGA的一部分,所以所有的用户能共享这些块。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能够组成独立的子cachebuffer 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 cachehash function

(2)如果在缓存里找到需要的块,移动这个块到LRU listMRU(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空间缓冲区。如果块不能读一致,则serverundo空间建立一个读一致拷贝

 

DBWn PorcessDatabase 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$waitstatv$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(DBW0DBW9)部署多个数据库写入器进程

--这对那些使用大量cpusmp系统十分有用

--多个进程不能与多个i/o从属同时使用

 

优化DBWn I/O

通过查看free buffer waits事件的值,来优化数据库写入进程

你可能感兴趣的:(oracle,sql,SQL Server,cache,performance)