buffer busy wait

1. ORACLE 访问Data buffer block的过程:
1)依据数据块的地址计算出数据块所在的bucket
2)获得保护这个bucket的cbc latch
3)在这个链表上找寻我们需要的数据块,找到后,pin这个buffer(读取s,修改x)
4)释放cbc latch
5)读取/修改数据块的内容
6)获取cbc latch
7)unpin这个buffer
8)释放cbc latch

2.buffer busy wait 等待事件形成原因:
(1). 读读
当一个session 读取一个block时,该block在cache中不存在,需要从disk读取至cache,此时其他session 想要读取该block时,就会发生buffer busy wait 等待事件。

(2). 写写
当一个session 修改block时,首先会对该block 进行buffer pin(修改x),因此其他session在对该block进行修改时都要等待上一个session unpin buffer。

(3). 读写
1)当读取的进程发现内存块正在被修改的时候(如果有x模式的buffer pin,就说明正在被修改),它只能等待,它不能clone块,因为这个时候内存块正在变化过程中ing,这个时候clone是不安全的。很多人说,oracle里读写是互相不阻塞的,oracle可以clone内存块,把读写的竞争分开。其实要看情况,在读的时候发现内存块正在被写,是不能够clone的,因为是不安全的。这个时候读的进程只能等待buffer busy waits。
2)当写的进程发现内存块正在被读,这个时候,读是不阻塞写的,因为ORACLE可以很容易的clone出一个xcur的数据块,然后在clone的块上进行写,这个时候clone是安全的,因为读内存块的进程不会去修改数据块,保证了clone的安全性。

(4). 

 

3.buffer busy wait 常见发生原因
(1). 性能差的QUERY访问相同的block 并发执行时,产生大量的物理读。 
(2). freelist 设置过小,导致并发insert table时,频繁扫描freelist,产生争用。
(3). 大量session 并发修改相同的index block

4.常用解决方法
(1). tuning sql 减少物理读
(2). 删除一些hot row 并重新insert 至其他block中
(3). 如果table 较小,可以考虑将其数据 cache至keep data buffer中
(4). 减少low cardinality index的使用。 避免index block 争用。
(5). 增加extents size。 避免oracle频繁分配空间而造成的extent map 争用。

 

5. 产生等待的block 类型及解决方法

 

Block Type Possible Actions
data blocks Eliminate HOT blocks from the application.                        Check for repeatedly scanned / unselective indexes.                        Change PCTFREE and/or PCTUSED. Check for 'right-                        hand-indexes' (indexes that get inserted into at the                         same point by many processes). Increase INITRANS.                         Reduce the number of rows per block.
segment header Increase of number of FREELISTs.                         Use FREELIST GROUPs (even in single instance this                         can make a difference).
freelist blocks Add more FREELISTS. In case of Parallel Server                         make sure that each instance has its own FREELIST                         GROUP(s).
undo header Add more rollback segments. 

 

6.相关命令

 SELECT p1 "File", p2 "Block", p3 "Reason"
    FROM v$session_wait 
   WHERE event='enq: TX - row lock contention';
   
select objd, file#,block#,class#,ts#,cachehint,status,dirty from v$bh where file#=546 and block#=1289912;

select * from dba_objects where object_id = 124269

select current_obj#,obj.object_name,count(*) from dba_hist_active_sess_history , dba_objects obj
where event='buffer busy waits' 
and sample_time>=to_date('2017-07-09 00:00:00','yyyy-mm-dd hh24:mi:ss') 
and sample_time<=to_date('2017-07-10 00:00:00','yyyy-mm-dd hh24:mi:ss') 
and obj.data_object_id = current_obj#
group by current_obj#,obj.object_name

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

转载于:http://blog.itpub.net/15412087/viewspace-2148432/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值