[转帖]热点块竞争与解决_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4260 | 回复: 0   主题: [转帖]热点块竞争与解决        下一篇 
derek
注册用户
等级:中校
经验:1550
发帖:209
精华:0
注册:2011-7-21
状态:离线
发送短消息息给derek 加好友    发送短消息息给derek 发消息
发表于: IP:您无权察看 2011-8-3 16:20:40 | [全部帖] [楼主帖] 楼主

热点块竞争与解决

热点块主要是latch竞争,大量进城等待latch free竞争,我们可以从V$SESSION_WAIT视图中查询得到:

SID         SEQ# EVENT
---------- ---------- -----------------------------------------------
4       14378 latch free
43         1854 latch free
176           977 latch free
187          4393 latch free
111          8715 latch free
209        48534 latch free


如果需要具体确定热点对象,可以从V$LATCH_CHILDREN中查询具体的子LATCH信息,可以通过以下SQL查询

SELECT*
FROM(SELECTaddr,
child#,
gets,
misses,
sleeps,
immediate_gets igets,
immediate_misses imiss,
spin_gets sgets
FROMv$latch_children
WHERENAME='cache buffers chains'
ORDERBYsleepsDESC)
WHEREROWNUM<11;


X$BH中还存在另外一个关键字段HLADDR,即hash chain latch address,这个字段可以和v$latch_children.addr进行关联,这样就可以把具体的LATCH竞争和数据块关联起来,在结合dba_extents视图,就可以找到具体的热点竞争对象,找到具体热点竞争对象之后,可以结合v$sqlarea或者v$sqltext,找到频繁操作这些对象��SQL,然后对其进行优化,即可缓解或解决热点块竞争的问题。

以下SQL可以获取当前持有最热点数据库的LATCH及BUFFER信息:

SELECTb.addr,
a.ts#,
a.dbarfil,
a.dbablk,
a.tch,
b.gets,
b.misses,
b.sleeps
FROM(SELECT*
FROM(SELECTaddr, ts#, file#, dbarfil, dbablk, tch, hladdr
FROMx$bh
ORDERBYtchDESC)
WHEREROWNUM<11) a,
(SELECTaddr, gets, misses, sleeps
FROMv$latch_children
WHERENAME='cache buffers chains') b
WHEREa.hladdr = b.addr;


利用前面提到的SQL可以找到这些热点BUFFER的对象信息:

SELECTdistincte.owner, e.segment_name, e.segment_type
FROMdba_extents e,
(SELECT*
FROM(SELECTaddr, ts#, file#, dbarfil, dbablk, tch
FROMx$bh
ORDERBYtchDESC)
WHEREROWNUM<11) b
WHEREe.relative_fno = b.dbarfil
ANDe.block_id <= b.dbablk
ANDe.block_id + e.blocks > b.dbablk;


结合V$sqltext或v$sqlarea,可以找到操作这些对象的相关SQL,继续查询:

SELECT
hash_value, sql_text
FROMv$sqltext
WHERE(hash_value, address)IN
(SELECTa.hash_value, a.address
FROMv$sqltext a,
(SELECTDISTINCTa.owner, a.segment_name, a.segment_type
FROMdba_extents a,
(SELECTdbarfil, dbablk
FROM(SELECTdbarfil, dbablk
FROMx$bh
ORDERBYtchDESC)
WHEREROWNUM<11) b
WHEREa.relative_fno = b.dbarfil
ANDa.block_id <= b.dbablk
ANDa.block_id + a.blocks > b.dbablk) b
WHEREa.sql_textLIKE'%'|| b.segment_name ||'%'
ANDb.segment_type ='TABLE')
ORDERBYhash_value, address, piece;


找到这些SQL之后,剩下的问题就简单了,可以通过优化SQL减少数据的访问,避免货优化某些容易引起争用的操作(如CONNECT BY等操作)来减少热点块竞争。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论