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直接确定想要的信息。
供大家参考。




