enq: HW - contention 说明:

硬件队列用于序列化段的高水位线以外的空间分配。

可以用手动分配范围即可解决问题。

V$SESSION_WAIT,P2 / V$LOCK.ID1 is the tablespace number.

V$SESSION_WAIT.P3 / V$LOCK.ID2 is the relative data block address (dba)

of segment header of the object for which space is being allocated.

巡检发现问题:

selectevent,count(*)fromgv$session_waitwherewait_class<>'Idle'groupbyevent;

1enq: HW - contention274

识别发生问题的会话:

selectsid,event,P2,P3fromgv$session_waitwhereeventlike'%HW%';

通过DBMS_UTILITY包,来定位发生HW争用的对象。

SELECTDBMS_UTILITY.data_block_address_file(ID2)FILE#,DBMS_UTILITY.data_block_address_block(ID2)BLOCK#FROMGV$LOCKWHERETYPE='HW';

通过上面查到的 文件号 和 块ID 定位到等待的对象。

SELECTOWNER,SEGMENT_TYPE,SEGMENT_NAMEFROMDBA_EXTENTSWHEREFILE_ID=111AND126423BETWEENBLOCK_IDANDBLOCK_ID+BLOCKS-1;

根据lob字段 查到相对应的表。

SELECTOWNER,TABLE_NAME,SEGMENT_NAMEFROMDBA_LOBSWHERESEGMENT_NAME='SYS_LOB0000080646C00004$$';

现在,已经查到是哪个LOB段造成的HW等待。应该向段中手动添加一个新的扩展区来解决问题。

添加一个该段中最大扩展区大小相同的扩展区。

查询对象最大扩展区的大小。

SELECTDISTINCTBYTESFROMDBA_EXTENTSWHERESEGMENT_NAME='SYS_LOB0000080646C00004$$'ANDOWNER='USER'

向lob字段添加扩展区。

altertableUSER.TABmodifylob('COL_NAME')(allocateextents(size64M));