龙空技术网

Oracle 常见等待事件之“buffer busy waits”

执着的花猫Jp 76

前言:

而今朋友们对“oracle序列缓存”可能比较珍视,咱们都想要分析一些“oracle序列缓存”的相关知识。那么小编同时在网上搜集了一些对于“oracle序列缓存””的相关资讯,希望各位老铁们能喜欢,同学们快快来学习一下吧!

等待事件: buffer busy waits

此等待表示缓冲区缓存中有一些缓冲区,多个进程正试图同时访问这些缓冲区。查询V$WAITSTAT以获取每类缓冲区的等待统计信息。具有缓冲区忙等待的常见缓冲区类包括数据块、段头、撤消头和撤消块。检查以下V$SESSION_WAIT参数列:

P1: File IDP2: Block IDP3: Class ID
原因分析

要确定可能的原因,首先查询V$SESSION,以在会话等待缓冲区忙等待时识别ROW_WAIT_OBJ#的值。SQL查询如下:

SELECT row_wait_obj#   FROM V$SESSION  WHERE EVENT = 'buffer busy waits';

要识别争用的对象和对象类型,请使用从V$SESSION返回的ROW_WAIT_OBJ#的值查询DBA_OBJECTS。例如:

SELECT owner, object_name, subobject_name, object_type  FROM DBA_OBJECTS WHERE data_object_id = &row_wait_obj;
问题解决

怎么解决取决于产生争用的块类别和实际段。

Segment Header

如果争用在段头上,那么这很可能是空闲列表争用。在本地管理的表空间中自动管理段空间,无需指定PCTUSED、FREELISTS和FREELIST GROUPS参数。如果可能,请从手动空间管理切换到自动分段空间管理(ASSM)。

如果您无法使用ASSM(例如,因为表空间使用字典空间管理),以下信息需要了解:

空闲列表是空闲数据块的列表,通常包括段内多个不同扩展数据块中存在的块。可用列表由可用空间尚未达到PCTFREE或已用空间已缩小到PCTUSED以下的块组成。使用FREELISTS参数指定进程空闲列表的数量。FREELISTS的默认值为1。最大值取决于数据块的大小。

要查找该段的空闲列表的当前设置,请运行以下操作:

SELECT SEGMENT_NAME, FREELISTS  FROM DBA_SEGMENTS WHERE SEGMENT_NAME = segment name   AND SEGMENT_TYPE = segment type;

设置空闲列表,或增加空闲列表的数量。如果添加更多的空闲列表并不能缓解问题,那么使用空闲列表组(即使在单个实例中,这也会有所不同)。如果使用Oracle RAC,请确保每个实例都有自己的空闲列表组。

Data Block

如果争用发生在表或索引(而不是段标头)上:

检查右侧索引。这些是由许多进程在同一点插入的索引。例如,那些对键值使用序列号生成器的方法。考虑使用ASSM、全局哈希分区索引或增加可用列表,以避免多个进程试图插入同一块。Undo Header

对于回滚段标头上的争用:如果您没有使用自动撤消管理,请添加更多回滚段。

Undo Block

对于回滚段块上的争用:如果您没有使用自动撤消管理,那么可以考虑增大回滚段的大小。

标签: #oracle序列缓存 #oracle等待事件及处理 #oraclehash索引