zrong 发表于 2018-9-12 11:02:02

ORACLE之热块优化方法小结

  原文转自http://www.itpub.net/thread-1713308-1-1.html
  访问频率非常高的数据块被称为热块(Hot Black),当很多用户同时访问某个数据块时,就会导致Lanch争用。常见的Lanch争用
  A    buffer busy waits
  B    cachebufferchain
  一、如果是cachebufferchainLatch的,要看访问相同数据块的会话会太长或这个列表太长
  1)如果这个列表太长
  原因:
  如果一条hash chain比其他hash chain长,它所管理的buffer header更多,那么发生cache buffers chains latch等待的几率就更大,
  办法:
  针对这个问题,可以通过增加hash bucket的数量进而影响hash chain的数量来达到缩短hash chain的目的.参数_db_block_hash_latches
  原理:
  8.0之前,hash buckets的个数等于db block buffers/4。也就是说,平均一个hash bucket上挂4个block。当然这只是平均值,很有可能通过hash函数转换block header的地址后会导致一个bucket上挂很多个block。
  8.0以后,oracle改成了hashbuckets=2*db block buffers。主要是为了降低一个bucket上挂的block的个数,从而减少扫描bucket所花费的时间。所以说,平均是一个bucket上挂0.5个block。但是实际上,一个bucket上可能会挂较多的block,而有些bucket上则没有挂block,这由block的地址决定。所以,增加bucket的个数,就可以增加block平均分布在bucket上的概率。
  注:
  其实在Oracle9i之后,我们基本上不会遇到这个问题了,除非遇到Bug。所以这个是不推荐的,记住,在对Oracle的隐含参数做修改之前一定要咨询Oracle Support。
  2)访问相同数据块的会话会太长
  原因:
  当多个会话重复访问一个或多个由同一个子chche buffer chains锁存器保护的块时,热块就产生。
  办法:
  调整隐藏参数_spin_count,增加进程成功获取latch的可能性,这个方法要慎用,增大_spin_count会增加cpu的负荷从而可能造成负面效果。
  二、如果是buffer busy waits
  1、、找到热块产生的SQL,根据执行计划查看是否合理,改变SQL为最优SQL
  A、找到最热的数据块的latch和buffer信息
  selectb.addr,a.ts#,a.dbarfil,a.dbablk,a.tch,b.gets,b.misses,b.sleepsfrom
  (select   *   from   (selectaddr,ts#,file#,dbarfil,dbablk,tch,hladdr   fromx$bh   order   by   tchdesc)   where   rownum
页: [1]
查看完整版本: ORACLE之热块优化方法小结