ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE的日志浪费是怎么产生的?

ORACLE的日志浪费是怎么产生的?

原创 Linux操作系统 作者:wei-xh 时间:2012-06-19 23:54:05 0 删除 编辑

为什么ORACLE写日志存在浪费?

ORACLE有项统计信息是用来统计redo wastage的,可以从sessiondatabase级别来统计。那么为什么会有日志浪费呢?日志浪费指的是什么呢?

磁盘的扇区大小一般为512字节,绝非巧合ORACLE REDO BUFFER的块大小也是512字节,每次写磁盘不得不以512字节为粒度,把LOG BUFFER里的数据像stream流水一样源源不断的写到LOG FILE里。看上图,有8LOG BUFFER BLOCKS,为了醒目标示出了块的边界,当前BUFFER已经分配的最高点在94 BLOCK的前半部分(start of free space),如果此时LGWR准备写LOG BUFFER里的数据到磁盘,并不是直接就写end of free space(见图) 位置写到start of free space的这段日志,而是它需要获取redo allocation latch移动start of free space点到这个块的末尾,然后从end of free space(见图) 位置写到start of free space(这个位置已经改变到94块的末尾)。ORACLE为什么要这么做?答案是因为出于效率的原因。如果LGWR写了第94BLOCK的前半部分到磁盘,这里我们假设写到了磁盘的X块(ORACLE需要有代码可以追踪到这个块)。假设我们的SESSION产生了新日志从PGA拷贝日志到LOG BUFFER的时候,继续填充第94BLOCK的后半部分,然后在下一次写磁盘的时候,需要预先把之前写到磁盘的X块定位到,然后再把整个94 BUFFER块写到磁盘的X块上(不确定是不是需要读取到内存里再写回磁盘,这里假设直接写磁盘),对比与直接写磁盘,无疑这种方式对性能是一个非常大的危害,而且也使ORACLE的代码路径变得比较冗长。ORACLE这样的处理方式无疑也可能存在一些问题,如果你的系统存在非常多的小事务,比如ROW BY ROW UPDATE,只产生了几十字节的日志,之占一个LOG BUFFER 512字节的很少一部分,这种情况造成的浪费就比较大,当然由于Group Commit 的关系,如果并发量比较大的话,这样的浪费会有一定程度的遏制。

 

c358befef1621abdeb293d07ee939a8d.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-733290/,如需转载,请注明出处,否则将追究法律责任。

上一篇: ORACLE的Group Commit
请登录后发表评论 登录
全部评论
Oracle ACE组成员,DBGeeK用户组发起人。曾在DTCC、ORACLE技术嘉年华、Gdevops等公开场合做过数据库技术专题分享,2017年应Oracle邀请在世界最大的数据库会议OOW上做技术分享。组织翻译了《拨云见日,解密Oracle ASM内核》一书。

注册时间:2009-07-04

  • 博文量
    422
  • 访问量
    2281372