Cache Buffers Chains解决思路一

本文提供了一种解决Oracle数据库中CBC(Cache Buffer Chains)锁定问题的方法,包括定位引起问题的SQL语句、分析执行计划及优化建议。

        Latch free相对来说是Oracle性能调优的一个难点,主要是定位造成CBC的语

句,国外数据库专家对latch造诣比较深的是andreynikolaev,Tanel Poder等。

以下是解决该问题的一个思路:

1、查看v$event_name中latch: caches buffers chain中p1,p2和p3值

      p1: address;  p2: number; p3: tries

2、通过ASH查看发生CBC最多的latch地址

select * from (
    select  event,
                 trim(to_char(p1, 'xxxxxxxxxx')) latch_addr,
                 trim(round(ratio_to_report(count(*)) over ()*100, 1)) ||' % '  PCT,
                 count(*)
     from v$active_session_history
     where
         event = 'latch: cache buffers chains'
      and session_state =' WAITING'
      group by event, p1
      order by count(*) desc
     )
 where rownum <10;

输出结果关注等待latch的LATCH_ADDR地址。

3、tanlepoder提供了latchprofx脚本,见附件
        (将附件latchprox.jpg改成latchprox.sql)

SQL>@latchprofx.sql sid, name,sqlid, object % "&latch_addr' 10000  --采样率

脚本内使用视图:

x$ksuprlat   :关于当前latch holder信息,
                        Kernel Service, User ,Process LATch holder

x$ksuse: 关于session信息: Kernel Service User SEssion

x$ksllw: latch 内容: Kernel Service Latch context Where

输出结果中,我们关注object地址,可以知道是哪个对象,SQLID可以知道是什么

语句。

4、查找文件和数据块对象

select dbms_utility.data_block_address_file(to_number('&object', 'xxxxxxx') file#,
        dbms_utility.data_block_address_block(to_number('&object', 'xxxxxxx') blk#
from dual

知道了文件和数据块,我们一种方法用dump block方式知道具体是哪个对象,或者
用传统的dba_extents (但该方法查询速度非常慢),或者使用x$BH等方式。查出对应的对象名是什么。

5、通过SQLID查看v$sqlarea,或v$SQL方法获得完整的SQL语句

select sql_fulltext from v$sqlarea where sql_id='&sqlid';

6、通过dbms_xplan.display_cursor脚本(参看前面文章“Oracle 10中如何使用
dbms_xplan分析执行计划”)

列出完整的执行计划。我们通过执行计划重点关注步骤4查出的对象名称

大部分情况下,CBC是改变SQL执行计划,通常造成该问题执行计划显现NL,filter问题。优化该语句基本能解决该问题。






fj.pnglatchprofx.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/354732/viewspace-697317/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/354732/viewspace-697317/

<think>好的,我现在需要解决用户提出的关于Oracle数据库中&#39;cache buffers chains&#39;相关的latch问题。首先,我得回忆下相关的知识,并结合用户提供的引用内容来分析解决方案。 用户提到了三个引用,其中引用[1]提到通过检查tch列来识别热块,引用[2]指出在升级系统后可能出现的性能下降问题,引用[3]则涉及集群等待事件的分析。这些信息提示我应该围绕如何识别和缓解高争用的cache buffers chains latch来展开。 首先,cache buffers chains latch争用通常是由于多个会话频繁访问同个数据块引起的,这会导致latch的频繁获取,进而引发竞争。常见的原因包括热块(hot block)、低效的SQL语句、或者不合理的索引设计。根据引用[1],可以通过检查buffer header中的tch值来找到被频繁访问的块,这可能帮助定位热块。 接下来,我需要考虑如何具体实施解决方案。可能的步骤包括: 1. **识别相关latch的信息**:通过查询v$latch或v$latch_children,确定具体的latch地址和相关的统计信息,如gets、misses等,以确认争用的存在和程度。 2. **定位热块**:根据引用[1]中的方法,使用tch值高的buffer来找到热块。可能需要关联x$bh和dba_objects视图,找到具体的对象和块。 3. **分析SQL语句**:找到访问这些热块的SQL语句,检查其执行计划,是否有全表扫描或不合适的索引使用,导致访问过多的块。 4. **优化策略**:包括优化SQL、调整索引、分区表、使用缓存技术等,减少对热块的访问。 另外,引用[2]提到系统升级后可能出现的性能问题,可能涉及到操作系统或Oracle版本的变化对latch机制的影响,这时候需要检查系统参数是否有调整,比如是否启用了大页内存,或者是否有其他资源竞争问题。可能需要调整隐藏参数或优化器设置。 引用[3]中的集群等待事件可能涉及到RAC环境,虽然用户的问题没有明确提到是否是RAC,但如果有的话,需要考虑全局缓存等待的情况,可能需要调整_gc相关的参数或优化应用设计以减少跨节点访问。 在具体操作中,可能需要使用到如AWR报告、ASH报告,或者直接查询动态性能视图来获取信息。例如,查询v$session_wait来查看当前会话的等待事件,或者使用AWR报告中的Latch Activity部分来分析历史争用情况。 还需要考虑其他可能的因素,比如块大小是否合适,是否存在频繁访问的小表,可以考虑将其保留在缓存中,或者使用keep池。此外,检查是否有索引的竞争,比如反向索引或哈希分区索引,以减少块竞争。 总结来说,解决步骤大致分为诊断和优化两部分。诊断阶段需要准确识别出导致争用的具体块和SQL,优化阶段则通过调整SQL、索引、参数等手段减少争用。同时,结合用户提供的引用内容,特别是关于tch值的应用和系统升级后的性能变化,需要特别注意这些方面的影响。</think>### 解决Oracle数据库中&#39;cache buffers chains&#39;相关的Latch争用问题 #### 1. **问题诊断** **步骤1:确认Latch争用来源** 通过以下查询定位具体的`cache buffers chains` latch子节点: ```sql SELECT addr, child#, gets, misses, sleeps FROM v$latch_children WHERE name = &#39;cache buffers chains&#39; ORDER BY sleeps DESC; ``` 高`sleeps`和`misses`值表明存在争用[^1]。 **步骤2:识别热块(Hot Block)** 根据引用[^1],通过`tch`(touch count)值识别频繁访问的缓冲区: ```sql SELECT bh.addr, bh.tch, bh.file#, bh.dbablk, obj.owner, obj.object_name FROM x$bh bh, dba_objects obj WHERE bh.obj = obj.data_object_id AND hladdr = &#39;<目标latch的ADDR>&#39; -- 替换为步骤1中的ADDR ORDER BY bh.tch DESC; ``` 高`tch`值对应的块可能是热块。 **步骤3:分析相关SQL语句** 找到访问热块的SQL: ```sql SELECT sql_id, sql_text FROM v$sql WHERE sql_id IN ( SELECT DISTINCT t.sql_id FROM v$session t, v$session_wait w WHERE w.event = &#39;latch: cache buffers chains&#39; AND t.sid = w.sid ); ``` 检查执行计划,确认是否存在全表扫描或不合理索引使用。 --- #### 2. **优化措施** **方法1:优化SQL与索引** - **添加合适的索引**:减少全表扫描,例如为高频访问字段添加反向键索引或哈希分区索引。 - **优化SQL逻辑**:避免重复访问相同块,例如通过批量处理减少单行提交。 **方法2:分散热块访问** - **分区表**:将大表按范围或哈希分区,分散数据块分布。 - **调整PCTFREE/PCTUSED**:减少块内行密度,降低争用概率。 **方法3:参数调整** - **增大缓冲池**:调整`db_cache_size`或使用KEEP池保留热块。 - **调整隐藏参数**: ```sql ALTER SYSTEM SET "_db_block_hash_latches"=1024; -- 增加latch数量(需谨慎测试) ``` **方法4:系统级优化(针对引用[^2]的升级问题)** - **检查OS调度策略**:升级到RHEL6/OEL6后,CPU调度可能变化,尝试绑定进程到特定CPU(CPU affinity)。 - **关闭透明大页(THP)**: ```bash echo never > /sys/kernel/mm/transparent_hugepage/enabled ``` --- #### 3. **验证与监控** - **实时监控**:使用`ASH报告`或`v$active_session_history`跟踪会话等待事件。 - **AWR分析**:对比优化前后的`latch: cache buffers chains`等待时间。 --- ### 示例优化场景 假设热块对应表`ORDERS`的主键索引块: 1. 将主键索引改为反向键索引: ```sql CREATE INDEX orders_pk_reverse ON orders(ORDER_ID REVERSE); ``` 2. 使用绑定变量减少硬解析: ```sql ALTER SYSTEM SET cursor_sharing = &#39;FORCE&#39;; ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值