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