专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

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

ins518 2024-11-07 12:10:48 技术文章 13 ℃ 0 评论



等待事件: buffer busy waits


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

P1: File ID
P2: Block ID
P3: 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

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表