暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

抛开复杂SQL,一步步寻找热块(定位到具体行数据)

原创 red_hope 2020-09-25
1338

1、观察session及等待事件

SELECT a.sid,a.serial#,a.username,a.sql_hash_value,a.osuser,a.program,a.machine,a.LAST_CALL_ET ET,b.event---,sql_id
          FROM v$session a, v$session_wait b
         WHERE a.sid = b.sid
          -- and b.event not like 'SQL%'
           and b.event not like 'rdbms%'
           and b.event not like 'smon%'
           and b.event not like 'pmon%'
           and b.event not like 'PX%'  
          --- AND b.event NOT LIKE 'SQL*Net%'
           AND b.event NOT LIKE 'rdbms ipc%'
           and a.STATUS='ACTIVE'
           and a.USERNAME is not null
         ORDER BY a.sql_hash_value,a.last_call_et;

在双机环境中,发生热块latch等待,极容易引起大量GC等待,GC解决的常用思路是:建分区表,每个分区操作及读取都固定在一个实例进行。(一般不太忙得数据库,即使交叉访问,也问题不大)。这个时候,如果数据库因gc出现问题,建议首先停止或重启相关应用,减轻影响。
另外,有时候也不是应用分区分表做的不好,而是执行计划不好导致的,例如本来应该走分区,结果走了全表扫,必然打乱架构部署,跨节点访问数据,势必会导致gc增加。

2、通过session,获取sql

select sql_text from v$sqltext where hash_value=&hash order by piece asc;

查询到sql,就知道是哪个表出问题,也就查到是哪个对象,即通过select * from dba_objects 查询到对象的object_id,例如确定块表为nxsoft_yg.mytest,id:75000

3、查询热表的热块信息

 select file#,dbablk block_id,tch hit_count,a.obj,a.hladdr from x$bh a where a.obj='75000';

期中file#是数据文件号,block_id是块号,tch是热块访问次数,这样就可以根据hit_count确定是当前对象上哪个块很热了,例如,这是后查询到875这块热度较高,下面就根据这个块查询到具体数据。

4、根据块号查询具体数据

一个块是DB_BLOCK_SIZE大小设定的,一般会存较多的行记录,

 select * from nxsoft_yg.mytest where dbms_rowid.rowid_block_number(rowid)='875';

结果:
TEST1	TEST2	TEST3
nijbits9442	nijbits9442	nijbits9442
nijbits9443	nijbits9443	nijbits9443
nijbits9444	nijbits9444	nijbits9444
nijbits9445	nijbits9445	nijbits9445
nijbits9446	nijbits9446	nijbits9446
nijbits9447	nijbits9447	nijbits9447
nijbits9448	nijbits9448	nijbits9448
nijbits9449	nijbits9449	nijbits9449
nijbits9450	nijbits9450	nijbits9450
nijbits9451	nijbits9451	nijbits9451
nijbits9452	nijbits9452	nijbits9452
nijbits9453	nijbits9453	nijbits9453
nijbits9454	nijbits9454	nijbits9454
nijbits9455	nijbits9455	nijbits9455

这里用到了dbms_rowid这个过程,这个过程可以解析rowid的对象、文件、块号,方法实例如下:
select dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id,dbms_rowid.rowid_row_number(rowid) row_number
from nxsoft_yg.mytest;
这样,就查到了具体当前是在访问那些热点数据了,可以反馈给应用侧进一步分析,进行架构调整等。

5、补充信息

一般热块也和latch等待事件相关的,xbh表中有hladdr字段,可以用这个字段和vlatch的addr关联,从latch等待事件中直接确定热块,可以编辑出更复杂的sql直接确定想要的信息。

供大家参考。

最后修改时间:2020-09-25 10:56:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论