当前和历史事件的性能架构表
对于等待,阶段,语句和事务事件,性能模式可以监视和存储当前事件。此外,事件结束时,性能架构可以将它们存储在历史记录表中。对于每种事件类型,性能模式都使用三个表来存储当前事件和历史事件。该表具有以下形式,其中名称xxx
指示事件类型(waits
,stages
,statements
,transactions
):
events_xxx_current
:“当前事件”表存储每个线程的当前监视事件(每个线程一行)。events_xxx_history
:“最近历史记录”表存储每个线程已结束的最新事件(每个线程最多行数)。events_xxx_history_long
:“长历史记录”表存储全局终止的最新事件(在所有线程中,每个表最多行数)。
_current
每种事件类型的表每个线程包含一行,因此没有用于配置其最大大小的系统变量。性能架构会自动调整历史记录表的大小,或者可以在服务器启动时使用特定于表的系统变量来明确配置大小,如描述各个历史表的各节所述。典型的自动调整大小值为_history
表的每个线程10行,表的总计10,000行_history_long
。
对于每个事件类型,_current
,_history
,和_history_long
表有相同的列。在_current
与_history
表具有相同的索引。该_history_long
表没有索引。
这些_current
表显示了服务器内部当前正在发生的情况。当前事件结束时,会将其从_current
表中删除。
在_history
与_history_long
表给出了在最近的过去发生的事情。当历史记录表已满时,旧事件将被丢弃,而新事件将被添加。_history
和_history_long
表以不同的方式使行过期,因为表具有不同的用途:
_history
用于调查独立于全局服务器负载的单个线程。_history_long
用于调查全局服务器,而不是每个线程。
两种类型的历史记录表之间的差异与数据保留策略有关。首次看到事件时,两个表都包含相同的数据。但是,每个表中的数据随着时间的推移会有所不同,因此,每个表中的数据可能会保留更长或更短的时间:
- 对于
_history
,当表包含给定线程的最大行数时,为该线程添加新行时,最早的线程行将被丢弃。 - 对于
_history_long
,当表已满时,添加新行时,最旧的行将被丢弃,而不管哪个线程在任一行中生成。
当线程结束时,其所有行将从_history
表中丢弃,但不会从_history_long
表中丢弃。
下面的示例说明了如何将事件添加到两种类型的历史记录表中以及从中删除两种情况。这些原则同样适用于所有事件类型。该示例基于以下假设:
- 性能架构配置为在
_history
表中每个线程保留10行,在表中总计10,000行_history_long
。 线程A每秒生成1个事件。
线程B每秒生成100个事件。
- 没有其他线程在运行。
执行5秒后:
- A和B分别产生了5和500个事件。
_history
包含A的5行和B的10行。由于每个线程的存储限制为10行,因此A不会丢弃任何行,而B则会丢弃490行。_history_long
包含A的5行和B的500行。由于表的最大大小为10,000行,因此任何一个线程都没有丢弃任何行。
执行5分钟(300秒)后:
- A和B分别产生了300和30,000个事件。
_history
包含A的10行和B的10行。由于每个线程的存储限制为10行,因此A的290行已被丢弃,而B的29 990行已被丢弃。A的行包含的数据长达10秒,而B的行仅包含长达0.1秒的数据。_history_long
包含10,000行。由于A和B每秒总共产生101个事件,因此该表包含的数据直到大约10,000 / 101 = 99秒,并且混合了B相对于A大约100到1的行。