buffercache:调整缓冲区高速缓存Cache(Buffer Cache)的性能

="t18">
  调整缓冲区高速缓存Cache(Buffer Cache)性能
  
  Buffer cache由数据块组成
  
  1. Buffer cache工作原理
  
  LRU列表:MRU ………………. LRU(全表扫描FTS放在LRU端)
  
  缓冲区块状态:Free、Pinned、Clean、Dirty
  
  Dirty List或Write List(写列表)
  
  数据库写进程DBW0将缓冲区高速缓存Cache中数据写到数据文件中
  
  2.测量Buffer cache性能
  
  测量Buffer cache命中率:
  SQL> select 1-((physical.value – direct.value – lobs.value)/logical.value) “Buffer Cache Hit Ratio” 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’;
  “Buffer Cache Hit Ratio”值要 > 90%
  
  使用STATSPACK来监视Buffer cache
  
  使用REPORT.TXT来监视Buffer cache
  
  非命中率指标:Free Buffer Inspected、Free Buffer Waits、Buffer Busy Waits(V$sysstat)
  
  使用Performance Manager(数据库例程)来监视Buffer Cache
  
  3. 提高缓冲区高速缓存Cache性能思路方法
  
  加大Buffer Cache大小:init.ora参数DB_CACHE_SIZE(动态参数)
  
  使用Buffer Cache Advisory功能决定Buffer Cache大小:
  
  首先将init.ora参数DB_CACHE_ADVICE设成ON然后查询V$DB_CACHE_ADVICE
  
  使用多个缓冲区池:
  Keep Pool: DB_KEEP_CACHE_SIZE
  Recycle Pool:DB_RECYCLE_CACHE_SIZE
  Default Pool: DB_CACHE_SIZE
  
  在内存中缓存Cache表: 表CACHE选项对优化小表全表扫描
  
  正确创建索引
  
  4.调整Large Pool和Java POOL
  
  Large Pool用于共享服务器、RMAN、并行查询、DBWR从属进程
  
  Large Pool大小通过init.ora参数Large_pool_size设置默认为8M
  
  从V$sgastat中监视free memory值:
  
  SQL>SELECT name,s FROM V$sgastat WHERE pool = ‘large pool’;
  
  JAVA_POOL池默认大小为32M对于大型Java应用JAVA_POOL池大小应大于50M
  
  init.ora参数java_pool_size
  
  从V$sgastat中监视free memory
  
  SQL>SELECT name,s FROM V$sgastat WHERE pool = ‘java pool’;
  
  调整重做有关性能
  
  Oracle重做有关组件包括:Redo Log Buffer、Online Redo Log、LGWR、Archive Log、Checkpo、Arch0
  
  1. 监视Redo Log Buffer性能
  
  Redo Log Buffer不采用LRU(Least Recently Used)算法治理
  
  当下列事件发生时Redo Log Buffer内容存盘:
  
  Commit时、每3秒、空间使用1/3、达到1M、检查点
  
  假如写入Redo Log Buffer速度超过LGWR存盘速度就会因等待而降低性能
  
  监视Redo Log Buffer重试率(<1%)
  Select retries.value/entries.value “Redo Log Buffer Retry Ratio”
  From V$sysstat retries, V$sysstat entries
  Where retries.name = ‘redo buffer allocation retries’
  And entries.name = ‘redo entries’;
  “Redo Log Buffer Retry Ratio”值要 < 1%

  
  Select name,value from V$sysstat where name=’redo log space requests’;
  
  假如该值大需要增加Redo Log Buffer
  
  2. 提高Redo Log Buffer性能
  
  增加Redo Log Buffer大小:init.ora参数log_buffer
  
  减小重做日志生成量(假如设置表NOLOGGING属性下列操作不记录在Online Redo Log中:用SQL* Loader直接路径加载
  
  NOLOGGING属性还可用于下列SQL语句:CREATE TABLE AS SELECT、CREATE INDEX、
  ALTER INDEX REBUILD、CREATE TABELSPACE)
  
  3. 调整检查点进程性能
  
  测量检查点进程性能:没有完成检查点进程次数
  select * from V$system_event;
  
  两个事件:checkpo completed、log file switch(checkpo incomplete)
  
  Select * from V$sysstat
  background checkpos started和background checkpos completed
  
  使用Alert日志来记录检查点进程:init.ora参数log_checkpo_to_alert
  
  使用Performance Manager来测量检查点进程性能:I/O中平均灰数据队列长度(假如为0,介绍说明检查点太频繁)
  
  建议调整online redo log大小使检查点进程每20-30分钟执行
  
  4. 调整联机重做日志文件
  
  使用V$system_event来监视联机重做日志文件性能:
  log file parallel write、log file switch completed
  
  调整联机重做日志文件思路方法:和数据文件、控制文件、归档日志文件分开放在原始设备上
  
  5. 调整归档性能
  
  检查归档进程性能:通过V$system_event中log file switch(archiving needed)事件
  
  检查每个归档进程状态:V$archive_processes
  
  创建多个归档进程:init.ora参数LOG_ARCHIVE_MAX_PROCESSES(默认为2)
  
  调整磁盘I/O性能
  
  哪些操作会导致磁盘I/O:
  
  将Buffer cache中内容写到数据文件
  
  写回退段
  
  将数据文件内容读到Buffer cache中
  
  将Redo log Buffer中内容写到online redo log中
  
  将online Redo log中内容归档到 archive log中
  
  1. 调整表空间和数据文件
  
  测量数据文件I/O:使用V$filestat
  
  使用STATSPACK来测量数据文件I/O
  
  使用REPORT.TXT来测量数据文件I/O
  
  使用Performance Manager(I/O)来测量数据文件I/O
  
  建议:
  
  不要在SYSTEM表空间存放用户数据
  
  将 I/O操作均分到几个数据文件上(监视数据文件I/O操作数)
  
  使用本地治理表空间
  
  将数据库文件和其它文件分开
  
  使用分区表和分区索引
  
  将大表放在单独表空间
  
  创建单独回退表空间
  
  创建个或多个临时表空间
  
  不要将联机重做日志文件和归档联机重做日志文件放在同个设备上
  
  至少将个控制文件放在个单独设备上
  
  检查V$sysstat中’table scans(long tables)’
  
  使用init.ora参数DB_FILE_MULTIBLOCK_READ_COUNT(默认为16)来优化表扫描
  
  2. 调整DBW0性能
  
  监视DBWR0性能
  
  使用V$system_event监视下列事件:buffer busy waits、free buffer waits、
  
  db file parallel write、write complete waits、
  
  使用init.ora参数DBWR_IO_SLAVES(优化磁盘I/O)、
  
  DB_WRITER_PROCESSES(默认为1优化Buffer Cache内部治理)
  
  假如DBWR_IO_SLAVES设为非0值DB_WRITER_PROCESSES值无效
  
  3.调整段I/O
  
  避免动态空间分配
  
  表有关存储特性
  
  空闲百分比(PCTFREE):每个对象数据块中为今后更新该对象而保留空间百分比可以输入0到99的间
默认值为10%
  
  已用百分比(PCTUSED):Oracle数据库为该对象每个数据块保留已用空间最小百分比个块已用空间低于“已用百分比”值时则该块将成为插入行目标可以输入1到99的间默认值为40%
  
  最小数量:创建段时已分配总区数默认值为1可以输入1或大于1
  
  SQL> alter table emp allocate extent ;
  
  事务处理数量
  
  值:在分配给该对象每个数据块内分配给事务处理条目数量可以输入1或2(对于簇和索引)到255的间
  
  最大值:可同时更新分配给对象数据块并行事务处理最大数量可以输入1到255的间
  
  自由表
  
  列表:表、簇或索引每个自由表组自由表数量可以输入1或大于1默认值为1
  
  组:表、簇或索引自由表组数量可以输入1或大于1默认值为1
  
  缓冲池
  
  行转移(更新行时超过块可用空间)和行链接(行大小超过块大小)概念
  
  使用V$sysstat来监视行转移和行链接:table fetch continued row
  
  SQL>analyze table emp compute statistics;
  
  使用DBA_TABLES来查询统计信息
  
  SQL> alter table emp deallocate unused;
  SQL> alter table scott.emp move tablespace users;
  
  表高水位标志High Water Mark(HWM)
  
  4.调整排序IO
  
  哪些SQL语句需要排序操作:order by、group by、selec distinct、union、
  
  ersect、minus、analyze、create index、联接
  
  V$sysstat内存排序和磁盘排序(临时表空间中)
  
  监视排序性能(内存排序比例>95%)
  
  使用init.ora参数SORT_AREA_SIZE(512K)、SORT_AREA_RETAINED_SIZE、
  pga_aggregate_target、WORKAREA_SIZE_POLOCY
  
  使用Performance Manager(数据库例程)来监视排序
  
  如何避免排序:SQL语法、正确索引、创建索引、ANALYZE
  v$sort_segment、v$sort_usage
  
  使用Tablespace Map
  
  使用 Reorg Wizard
  
  5. 优化回退段
  
  个回退段区间可以分配给多个事务回退段个数据块只能分配给个事务
  
  测量回退段事务表争用
  select * from V$system_event where event like ‘%undo%’;
  
  回退段事务表等待时间应接近于0
  
  select * from V$waitstat;
  V$rollstat
  
  回退段事务表访问成功率应>95%
  
  回退段区间争用
  V$waitstat、V$sysstat
  
  回退段事务环绕(Wrap):个事务占用回退段从个区间扩展到另个区间
  
  回退段动态区间分配
  V$system_event
  
  使用V$rollstat来监视回退段使用情况
  
  使用Performance Manager(后台进程)来测量回退段
  
  提高回退段性能
  
  Oracle9i中撤消表空间
  
  建议:每 4个事务使用个回退段最多不超过20个回退段
  
  会退段区间大小512k最小区间数20
  
  明确分配回退段给事务
  SQL> transaction use rollback segment rbs01;
  
  最小化回退段活动:EXPORT、IMPORT、SQL* Loader时加commit=y参数
  
  Oracle9i中撤消表空间
  
  调整闩(latch)和锁定(lock)
  
  1.  调整闩(latch)
  
  闩可以作为内存性能个指标
  
  1.闩:等待闩和立即闩(V$lacth共239个)
  
  数据库中是否存在闩争用V$system_event("latch free")
  
  几个重要闩:shared pool、library cache、cache buffers lru chain、
  
  cache buffers chains、redo allocation、redo copy
  
  select * from V$latch where misses!=0;
  
  2.自由列表:V$system_event("buffer busy waits")
  
  V$waitstat
  
  测量哪些段存在自由列表争用:dba_segments、V$session_wait

  
  alter table scott.emp storage (freelists 5);
  
  自动段空间治理表空间
  
  2.  调整锁定
  
  DML锁(TM)和DDL锁(TX)
  
  锁定模式:
  
  RX:对表UPDATE、INSERT、DELETE时获得
  
  RS:对表SELECT … FOR UPDATE时获得
  
  S: LOCK TABLE EMP IN SHARE MODE; 可以是多个用户获得
  
  SRX: LOCK TABLE EMP IN SHARE ROW EXCLUSIVE MODE; 只能是个用户获得
  
  外键约束时锁定死锁
  
  用Lock Monitor监视锁定
  
  调整操作系统
  
  1. 调整操作系统
  
  观察内存和CPU利用率(<90%)
  
  2. 使用Resource Manager
  
  资源使用者组个用户可以是多个资源使用者组成员次只有个组是活动
  
  确定用户CPU利用率(v$sesstat和v$sysstat)
  
  资源计划:由资源计划指令组成次只能有个资源计划是活动(V$rsrc_plan)
  alter system resource_manager_plan=system_plan;
  select username,RESOURCE_CONSUMER_GROUP from V$session;
  
  子计划
  
  资源计划调度
  
  使用Expert进行优化
  
  第步:创建个优化会话(tuning session)
  
  第 2步:确定优化范围(scope)
  
  第 3步:收集数据
  
  第 4步:复查(review)已收集到数据
  
  第 5步:生成建议案建议报告
  
  第 6步:创建实现建议所需SQL脚本
Tags:  response.buffer buffer 缓存cache buffercache

延伸阅读

最新评论

发表评论