Oracle的逻辑结构(表空间、段、区间、块)——Oracle数据块(二)

本文提供了一系列SQL脚本,用于诊断和解决Oracle数据库中的热点块竞争问题。通过查询x$bh和v$latch_children视图,可以定位到最繁忙的数据块及与其相关的SQL语句。进一步地,通过对热点SQL进行优化或调整数据库操作方式,可以有效缓解热点块竞争。
以下脚本来自于互联网,具体出处已经找不到了,如有知道还请告知!

关于热点块的查询
 
==== 查询当前数据库 最繁忙的 Buffer , TCH(Touch) 表示访问次数越高,热点快竞争问题就存在 =====
SELECT *
 FROM (SELECT  addr, ts#, file#, dbarfil, dbablk, tch
           FROM x$bh
       ORDER BY tch DESC)
 WHERE ROWNUM < 11;
 
==== 查询当前数据库最繁忙的 Buffer ,结合 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;
 
============= 如果在 Top 5 中发现 latch free 热点块事件时,可以从 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;
 
================ 获取当前持有最热点数据块的 Latch 和 buffer 信息 ==========
SELECT b.addr, a.ts#, a.dbarfil, a.dbablk, 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 distinct 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;
 
================ 结合 SQL 视图可以找到操作这些对象的相关 SQL ,然后通过优化 SQL 减少数据的访问,
或者优化某些容易引起争用的操作(如 connect by 等操作)来减少热点块竞争 =================
 
break on hash_value skip 1
SELECT /*+ rule */ 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;

也可以参看 热点块竞争和解决(cache buffers chains)
http://blog.oracle.com.cn/html/32/203732-4268.html
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值