技术开发 频道

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

    热点问题的解决

    热点块和热点对象我们都找到了,但是我们该怎么来解决这个问题呢?一般来说,热点块会导致cache buffers chains竞争等待,但并不是说cache buffer chains一定是因为热点块而起,在特别情况下有可能是因为latch数量的问题导致的,也就是一个latch管理的buffers数量太多而导致竞争激烈。但是latch数量我们一般是不会轻易去设置的,这是oracle的隐藏参数。

    实际上最有效的办法,是从优化sql入手,不良的sql往往带来大量的不必要的访问,这是造成热点块的根源。比如本该通过全表扫描的查询却走了索引的range scan,这样将带来大量的对块的重复访问。从而形成热点问题。再或者比如不当地走了nested loops的表连接,也可能对非驱动表造成大量的重复访问。

    那么在这个时候,我们的目标就是找出这些sql来并尝试优化。在statspack报告中,根据报告中sql列表,我们如果是通过dba_extents确定的热点对象而不是通过dba_objects确定的,则可以通过查找出的热点segment转换为对应的表,对于非分区的索引,index_name就是segment_name,通过dba_indexes很容易的找到对应的table_name,对于分区表和分区索引也能通过和dba_tab_partition和dba_ind_partitions找到segment和table的对应关系。通过这些table到statspack报告中去找相关的sql。

    select sql_text
    from stats$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 a.hash_value,a.address,a.piece;

    SQL_TEXT
    ----------------------------------------------------------------
    SELECT SEQ_SMS_TRANSACTION.nextval FROM DUAL
    SELECT SEQ_BIZ_EXPRESS.nextval FROM DUAL
    SELECT bizgroup.seq_grp_post.NextVal FROM DUAL
    SELECT SEQ_SAMPLE.nextval FROM DUAL
    SELECT bizgroup.seq_grp_user.NextVal FROM DUAL
    SELECT SEQ_BIZ_SEARCHER.nextval FROM DUAL
    SELECT SEQ_OFFER_DRAFT.nextval FROM DUAL
    select seq_Company_Draft.NextVal from DUAL
    SELECT SEQ_SAMPLE_GROUP.nextval FROM DUAL
    SELECT SEQ_CMNTY_USER_MESSAGE.nextval FROM DUAL
    SELECT SYSDATE FROM DUAL
    select seq_News_Forum.NextVal from DUAL
    SELECT SEQ_SMS_USER.nextval FROM DUAL
    select seq_Biz_Member.NextVal from DUAL
    select seq_Pymt_Managing.NextVal from DUAL
    E= '+08:00' NLS_DUAL_CURRENCY = '$' NLS_TIME_FORMAT = 'HH.MI.SSX
    SELECT SEQ_COMPANY_DRAFT.nextval FROM DUAL
    SELECT 1 FROM DUAL
    select seq_offer_draft.NextVal from DUAL
    select seq_Biz_Express_Category.NextVal from DUAL

    20 rows selected.

0
相关文章