“写至表”和文件事件监视器缓存

对于写至表和文件事件监视器而言,事件监视器在将输出写至文件或表之前将输出存储在缓冲区中。

表 1 显示了哪些事件监视器使用此类输出缓冲区。
表 1. 事件监视器和输出缓冲区
事件监视器类型 将输出写至磁盘前是否先写至缓冲区?
活动
缓冲池
变更历史记录
连接
数据库
死锁(所有版本)
锁定
程序包高速缓存
语句
统计信息
表空间
事务
工作单元
不使用缓冲区的事件监视器会使用更新更快速的机制将输出写至磁盘,从而不需要缓冲区。

对于使用缓冲区的事件监视器,缓冲区已满时记录会自动写至磁盘。 因此,通过指定较大的缓冲区以减少磁盘访问次数,可以改善高吞吐量事件监视器的监视性能。 为了强制事件监视器清空其缓冲区,必须释放该事件监视器,或者使用 FLUSH EVENT MONITOR 语句来清空缓冲区。

使用缓冲区的事件监视器允许您指定事件监视器输出是受阻还是非受阻。 对于受阻事件监视器来说,当它的两个缓冲区都变满时,它将暂挂正在发送监视器数据的数据库进程。 这是为了确保在受阻事件监视器活动期间不会删除任何事件记录。 在将缓冲区内容写入文件或表之前,暂挂的数据库进程以及任何从属数据库进程都无法运行。 根据工作负载类型以及 I/O 设备速度的不同,这会造成极大的性能下降。 缺省情况下,事件监视器处于受阻状态。

对于非受阻事件监视器来说,如果从代理程序接收监视器数据的速度高于事件监视器写数据的速度,它将删除那些数据。 这样就可以避免事件监视操作影响其他数据库活动的性能。

删除了事件记录的事件监视器会生成溢出事件。 此事件指定了监视器删除事件的开始时间和停止时间以及在该时间段内删除的事件数。 事件监视器有可能对要报告的暂挂溢出终止或释放。 如果发生这种情况,就会将以下消息写入管理日志:
DIA2503I Event Monitor monitor-name had a pending overflow record
when it was deactivated.

各个事件记录也会发生丢失事件监视数据的情况。 如果事件记录长度超过事件缓冲区大小,在缓冲区中装不下的数据就会被截断。 例如,如果正在捕获 stmt_text 监视元素并且连接到被监视数据库的应用程序发出了很长的 SQL 语句,就会发生数据截断的情况。 如果必须捕获所有事件记录信息,请指定较大的缓冲区。 请记住,较大的缓冲区会降低写入文件或表的频率。