业务系统反应数据库慢,根据时间查看awr报告。
先看一眼事件名称
HW enqueue 用于序列化超出段高水位线的空间分配。如果同时向对象添加大量数据,则多个进程可能同时尝试在高水位线上方分配空间,从而导致争用。
既然是控制资源并发的enq,那么相关信息还可看
利用ash的便利性,直接看
这里有事件和p1 p2 p3
根据p2 了解一下发生热点的表空间
select name from v$tablespace where ts#= &p2 ;
或
根据p3 看看所在文件
select DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(&p3) FILE#,DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(&p3) BLOCK# from dual;
然后定位到具体对象
select owner, segment_type, segment_name
from dba_extents
where file_id = 5 and 618 between block_id and block_id + blocks - 1
and tablespace_name = (select name from ts$ where ts#= &p2);
其实ash中早已给出明确信息
如果当前还在发生,可以找一下阻塞源头
SELECT distinct w.HW, w.p2 OBJECT_ID, l.inst_id, l.sid, l.lmode, l.request
FROM
( SELECT p2, p3, 'HW-'||substr(p2raw,-8)||'-'||lpad(p3,8,'0') HW
FROM v$session_wait
WHERE event='enq: HW - contention'
and state='WAITING'
) W,
gv$lock L
WHERE l.type(+)='HW'
and l.id1(+)=w.p2
and l.id2(+)=w.p3
ORDER BY hw, lmode desc, request desc
;
或者看当前涉及哪些对象
select DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(ID2) FILE#,
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(ID2) BLOCK#
from v$lock
where type = 'HW';
频繁扩展空间有可能会导致此事件,可以提前扩展。
alter table t1 allocate extent (size 8G);
如果涉及对象含有blob字段,可以通过一次初始化多个chunk来解决
Alter system set events '44951 TRACE NAME CONTEXT FOREVER, LEVEL 1024';
这里的level可以是128,512 or 1024。
执行alter system之前一定要检查当前是否设置了其他event
col name for a12
col value for a50
select inst_id, name, value from gv$parameter where name like 'event%';
也可以提前分配
ALTER TABLE <lob_table>
MODIFY LOB (<column_name>) (allocate extent (size <extent size>));