技术开发 频道

深度分析数据库的热点块问题

    如何确定热点对象

    如果我们经常关注statspack报告,会发现有时候出现cache buffer chains的等待。这个cache buffer chains就是_db_block_hash_latches所定义的latch的总称,通过查询v$latch也可得到:

    select">sys@OCN>select latch#,name,gets,misses,sleeps from v$latch where name like 'cache buffer%';

    LATCH# NAME GETS MISSES SLEEPS
    ---------- ------------------------------ ---------- ---------- ----------
    93 cache buffers lru chain 54360446 21025 238
    98 cache buffers chains 6760354603 1680007 27085
    99 cache buffer handles 554532 6 0

    在这个查询结果里我们可以看到记录了数据库启动以来的所有cahce buffer chains的latch的状况,gets表示总共有这么多次请求,misses表示请求失败的次数(加锁不成功),而sleeps 表示请求失败休眠的次数,通过sleeps我们可以大体知道数据库中latch的竞争是否严重,这也间接的表征了热点块的问题是否严重。由于v$latch是一个聚合信息,我们并不能获得哪些块可能存在频繁访问。那我们要来看另一个view信息,那就是v$latch_children,v$latch_children.addr记录的就是这个latch的地址。

    select">sys@OCN>select addr,LATCH#,CHILD#,gets,misses,sleeps from v$latch_children
    2 where name = 'cache buffers chains' and rownum < 21;

    ADDR LATCH# CHILD# GETS MISSES SLEEPS
    -------- ---------- ---------- ---------- ---------- ----------
    91B23B74 98 1024 10365583 3957 33
    91B23374 98 1023 5458174 964 25
    91B22B74 98 1022 4855668 868 15
    91B22374 98 1021 5767706 923 22
    91B21B74 98 1020 5607116 934 31
    91B21374 98 1019 9389325 1111 25
    91B20B74 98 1018 5060207 994 31
    91B20374 98 1017 18204581 1145 18
    91B1FB74 98 1016 7157081 920 23
    91B1F374 98 1015 4660774 922 22
    91B1EB74 98 1014 6954644 976 32
    91B1E374 98 1013 4881891 970 19
    91B1DB74 98 1012 5371135 971 28
    91B1D374 98 1011 5154497 990 26
    91B1CB74 98 1010 5013796 936 18
    91B1C374 98 1009 5667446 939 25
    91B1BB74 98 1008 4673421 883 14
    91B1B374 98 1007 4589646 986 17
    91B1AB74 98 1006 10380781 1020 20
    91B1A374 98 1005 5142009 1110 19

    20 rows selected.

    到此我们可以根据v$latch_child.addr关联到对应的x$bh.hladdr(这是buffer header中记录的当前buffer所处的latch地址),通过x$bh可以获得块的文件编号和block编号。

    select">sys@OCN>select dbarfil,dbablk
    from x$bh
    where hladdr in
    (select addr
    from (select addr
    from v$latch_children
    order by sleeps desc)
    where rownum < 11);

    DBARFIL DBABLK
    ---------- ----------
    4 6498
    40 14915
    15 65564
    28 34909
    40 17987
    1 24554
    8 21404
    39 29669
    28 46173
    28 48221

    ……………………

    由此我们就打通了cache buffers chains和具体block之间的关系,那再继续下来,知道了block,我们需要知道究竟是哪些segment。这个可以通过dba_extents来获得。

    select distinct a.owner,a.segment_name from
    dba_extents a,
    (select dbarfil,dbablk
    from x$bh
    where hladdr in
    (select addr
    from (select addr
    from v$latch_children
    order by sleeps 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;

    OWNER SEGMENT_NAME SEGMENT_TYPE
    ------------------------------ ------------------------------ ------------------
    ALIBABA BIZ_SEARCHER TABLE
    ALIBABA CMNTY_USER_MESSAGE TABLE
    ALIBABA CMNTY_VISITOR_INFO_PK INDEX
    ALIBABA COMPANY_AMID_IND INDEX
    ALIBABA COMPANY_DRAFT TABLE
    ALIBABA FEEDBACK_POST TABLE
    ALIBABA IM_BLACKLIST_PK INDEX
    ALIBABA IM_GROUP TABLE
    ALIBABA IM_GROUP_LID_IND INDEX
    ALIBABA MEMBER TABLE
    ALIBABA MEMBER_PK INDEX
    ALIBABA MLOG$_SAMPLE TABLE

    ……………………

0
相关文章