Oracle X$BH

SYS用户可查询 buffer header数据,可以从数据库的数据字典表中查询得到,这张字典表就是x$bh,其中的bh就是指buffer headers,每个buffer在x$bh中都存在一条记录. buffer header中存储每个buffer容纳的数据块的文件号,块地址,状态等重要信息,根据这些信息,结合dba_extents视图,可以很容易地找到每个buffer对应的对象信息: x$bh中还有一个重要的字段TCH,TCH为Touch的缩写,表示一个Buffer的访问次数,buffer被访问的次数越多,说明该buffer就越抢手,也就可能存在热块竞争的问题 可以结合DUMP BH来对比X$BH中字段。

SQL> desc v$bh;

 Name             Type
 -----------------------------
 ADDR             RAW(4)    --Hex address of the Buffer Header.视图中某行的地址-缓冲区头的十六进制地址
 INDX             NUMBER    --Buffer Header number
 INST_ID          NUMBER
 HLADDR           RAW(4)    --即hash chain latch address可以和v$latch_children.addr关联,把latch和数据块关联起来
 BLSIZ            NUMBER    --块大小
 NXT_HASH         RAW(4)  --下一个BH的HASH值
 PRV_HASH         RAW(4)  --前一个BH的HASH值
 NXT_REPL         RAW(4)  --下一个BH的在LRU链上HASH值
 PRV_REPL         RAW(4)  --前一个BH的在LRU链上HASH值
 FLAG             NUMBER      ---块的状态,在BH中可能是buffer_dirty block_written_once redo_since_read,详见最后
 FLAG2            NUMBER
 LOBID            NUMBER
 RFLAG            NUMBER    
 SFLAG            NUMBER
 LRU_FLAG         NUMBER   --- LRU_FLAG,详见最后
 TS#              NUMBER    --tablespace number表空间号
 FILE#            NUMBER    --块在数据库内绝对文件号
 DBARFIL          NUMBER    --块的相对文件号
 DBABLK           NUMBER    --块号--在数据文件上的
 CLASS            NUMBER    --太长,见最下面。
 STATE            NUMBER    --太长,见最下面。
 MODE_HELD        NUMBER    --
 CHANGES          NUMBER
 CSTATE           NUMBER
 LE_ADDR          RAW(4)    --Lock Element address (OPS)
 DIRTY_QUEUE      NUMBER    --LRUW上的buffer
 SET_DS           RAW(4)    -- Buffer cache set this buffer is under
 OBJ              NUMBER    --对象号
 BA               RAW(4)    --BUFFER ADDRESS--在内存中的地址
 CR_SCN_BAS       NUMBER    --Consistent Read SCN base 一致读SCN低位
 CR_SCN_WRP       NUMBER    --Consistent Read SCN wrap  一致读SCN高位
 CR_XID_USN       NUMBER    -- CR XID Undo segment no
 CR_XID_SLT       NUMBER    -- CR XID slot
 CR_XID_SQN       NUMBER    --CR XID Sequence
 CR_UBA_FIL       NUMBER    -- CR UBA file
 CR_UBA_BLK       NUMBER    -- CR UBA Block
 CR_UBA_SEQ       NUMBER    --CR UBA sequence
 CR_UBA_REC       NUMBER    --CR UBA record
 CR_SFL           NUMBER    --
 CR_CLS_BAS       NUMBER
 CR_CLS_WRP       NUMBER
 LRBA_SEQ         NUMBER    --Lowest RBA needed to recover block in cache
 LRBA_BNO         NUMBER
 HSCN_BAS         NUMBER    ---SCN的低位
 HSCN_WRP         NUMBER    ---SCN的高位
 HSUB_SCN         NUMBER
 US_NXT           RAW(4)
 US_PRV           RAW(4)
 WA_NXT           RAW(4)
 WA_PRV           RAW(4)
 OQ_NXT           RAW(4)    --- 对象队列前一个HASH值
 OQ_PRV           RAW(4)    --- 对象队列后一个HASH值
 AQ_NXT           RAW(4)    ---辅助对象队列前一个HASH值
 AQ_PRV           RAW(4)    ---辅助对象队列后一个HASH值
 OBJ_FLAG         NUMBER
 TCH              NUMBER    --Touch的缩写,表示一个Buffer的访问次数
 TIM              NUMBER    --Touch Time
 CR_RFCNT         NUMBER

 SHR_RFCNT        NUMBER

bh即描述了数据块块头的信息,buffer header描述了数据块的信息.

 

 

下面查询可获得数据库最繁忙的Buffer

select * from (select addr,ts#,file#,dbarfil,dbablk,tch from x$bh order by tch desc) where rownum<11;

在结合dba_extents中的信息,可以查询得到这些热点Buffer都来自哪些对象:

select e.owner,e.segment_name,e.segment_type from dba_extents e,(select * from(select addr,ts#,file#,dbarfil,dbablk,tch from x$bh order by tch desc)

where rownum<11)b

where e.relative_fno=b.dbarfil

and e.block_id<=b.dbablk

and e.block_id+e.blocks>b.dbablk;

热点块与竞争的解决可以从v$latch_children中查询具体的子Latch信息

select * from(select addr,child#,gets,misses,sleeps,immediate_gets igets,immediate_misses imiss,spin_gets sgets

from v$latch_children

where name='cache buffers chains'

order by sleeps desc)

where rownum<11;

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

可以通过如下查询获取当前持有最热点数据块的Latch及Buffer信息:

select b.addr,a.ts#,a.dbarfil,a.tch,b.gets,b.misses,b.sleeps from

(select * from (

select addr,ts#,file#,dbarfil,dbablk,tch,hladdr from x$bh order by

tch desc) where rownum<11) a,

(select addr,gets,misses,sleeps from v$latch_children where

name='cache buffers chains')b

where a.hladdr=b.addr

根据如下的sql找到这些热点buffer的对象的信息

select e.owner,e.segment_name,e.segment_type from dba_extents e,

(select * from (select addr,ts#,file#,dbarfil,dbablk,tch from x$bh

order by tch desc)

where rownum<11) b

where e.relative_fno=b.dbarfil and e.block_id<=b.dbablk

and e.block_id+e.blocks>b.dbablk;

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

找到sql之后,就可以通过优化SQL减少数据的访问。

break on hash_value skip 1;

select hash_value,sql_text from v$sqltext

where (hash_value,address) in (

select a.hash_value,a.address from v$sqltext a,

(select distinct a.owner,a.segment_name,a.segment_type

from dba_extents a,

(select dbarfil,dbablk from (

select dbarfil,dbablk from x$bh order by tch desc)

where rownum<11) b

where a.relative_fno=b.dbarfil

and a.block_id<=b.dbablk

and a.block_id+a.blocks>b.dbablk) b

where a.sql_text like '%'||b.segment_name||'%' and b.segment_type='TABLE'

)order by hash_value,address,piece;

 

对latch导致的热快争用解决请参考我另外一篇博客:Oracle latch: cache buffers chains

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值