29.12.20.3 语句摘要总结表
性能模式维护用于收集当前和最近的语句事件以及聚合这些信息的摘要表。第 29.12.6 节,“性能模式语句事件表” 描述了语句摘要是基于的事件。有关语句事件内容、当前和历史语句事件表以及如何控制语句事件收集(部分默认禁用)的信息,请参阅该讨论。
示例语句事件摘要信息:
mysql> SELECT *
FROM performance_schema.events_statements_summary_global_by_event_name\G
*************************** 1. row ***************************
EVENT_NAME: statement/sql/select
COUNT_STAR: 54
SUM_TIMER_WAIT: 38860400000
MIN_TIMER_WAIT: 52400000
AVG_TIMER_WAIT: 719600000
MAX_TIMER_WAIT: 12631800000
SUM_LOCK_TIME: 88000000
SUM_ERRORS: 0
SUM_WARNINGS: 0
SUM_ROWS_AFFECTED: 0
SUM_ROWS_SENT: 60
SUM_ROWS_EXAMINED: 120
SUM_CREATED_TMP_DISK_TABLES: 0
SUM_CREATED_TMP_TABLES: 21
SUM_SELECT_FULL_JOIN: 16
SUM_SELECT_FULL_RANGE_JOIN: 0
SUM_SELECT_RANGE: 0
SUM_SELECT_RANGE_CHECK: 0
SUM_SELECT_SCAN: 41
SUM_SORT_MERGE_PASSES: 0
SUM_SORT_RANGE: 0
SUM_SORT_ROWS: 0
SUM_SORT_SCAN: 0
SUM_NO_INDEX_USED: 22
SUM_NO_GOOD_INDEX_USED: 0
SUM_CPU_TIME: 0
MAX_CONTROLLED_MEMORY: 2028360
MAX_TOTAL_MEMORY: 2853429
COUNT_SECONDARY: 0
...
每个语句摘要表都有一个或多个分组列,用于指示如何对事件进行聚合。事件名称引用setup_instruments
表中的事件仪器名称:
-
events_statements_summary_by_account_by_event_name
有EVENT_NAME
,USER
和HOST
列。每一行总结了给定帐户(用户和主机组合)及其对应事件的事件。 -
events_statements_summary_by_digest
有SCHEMA_NAME
和DIGEST
列。每一行总结了给定模式和摘要值的事件。(DIGEST_TEXT
列包含对应的规范化语句摘要文本,但既不是分组列也不是摘要列。QUERY_SAMPLE_TEXT
,QUERY_SAMPLE_SEEN
和QUERY_SAMPLE_TIMER_WAIT
列同样既不是分组列也不是摘要列;它们支持语句抽样。)表中的最大行数在服务器启动时自动调整。要显式设置这个最大值,请在服务器启动时设置
performance_schema_digests_size
系统变量。 -
events_statements_summary_by_host_by_event_name
有EVENT_NAME
和HOST
列。每一行总结了给定主机和事件名称的事件。 -
events_statements_summary_by_program
有OBJECT_TYPE
,OBJECT_SCHEMA
和OBJECT_NAME
列。每一行总结了给定存储程序(存储过程或函数、触发器或事件)的事件。 -
events_statements_summary_by_thread_by_event_name
有THREAD_ID
和EVENT_NAME
列。每一行总结了给定线程和事件名称的事件。 -
events_statements_summary_by_user_by_event_name
有EVENT_NAME
和USER
列。每一行总结了给定用户和事件名称的事件。 -
events_statements_summary_global_by_event_name
有一个EVENT_NAME
列。每一行总结了给定事件名称的事件。 -
prepared_statements_instances
有一个OBJECT_INSTANCE_BEGIN
列。每一行总结了给定预准备语句的事件。
每个语句摘要表都有这些聚合列,包含累积值(除了注明之外):
-
COUNT_STAR
,SUM_TIMER_WAIT
,MIN_TIMER_WAIT
,AVG_TIMER_WAIT
,MAX_TIMER_WAIT
这些列与同名列在等待事件摘要表中(参见第29.12.20.1节,“等待事件摘要表”)类似,只是这些语句摘要表将事件从
events_statements_current
表中聚合,而不是从events_waits_current
表中聚合。prepared_statements_instances 表没有这些列。
-
SUM_
xxx
语句摘要表中的对应
xxx
列的总和。例如,语句摘要表中的SUM_LOCK_TIME
和SUM_ERRORS
列是events_statements_current
表中LOCK_TIME
和ERRORS
列的总和。 -
MAX_CONTROLLED_MEMORY
报告了在执行过程中由一个语句使用的最大受控内存量。
-
MAX_TOTAL_MEMORY
报告了在执行过程中由一个语句使用的最大总内存量。
-
COUNT_SECONDARY
表示查询在
SECONDARY
引擎上被处理的次数。对于MySQL HeatWave服务和HeatWave,PRIMARY
引擎是InnoDB,SECONDARY
引擎是HeatWave(RAPID
)。对于MySQL Community Edition Server、MySQL Enterprise Edition Server(本地部署)和没有HeatWave的MySQL HeatWave服务,查询总是在PRIMARY
引擎上处理,因此这些MySQL Server上的值始终为0。
表events_statements_summary_by_digest
包含以下额外摘要列:
-
FIRST_SEEN
,LAST_SEEN
表示具有给定摘要值的语句在服务器上首次被看到和最近一次被看到的时间戳。
-
QUANTILE_95
:语句延迟的95分位数,单位为皮秒。这一分位数是一个高估值,由收集到的直方图数据计算得出。换句话说,对于给定的摘要值,95%的测量语句具有延迟低于QUANTILE_95
。要访问直方图数据,请使用第29.12.20.4节,“语句直方图摘要表”中描述的表。
-
QUANTILE_99
:与QUANTILE_95
类似,但为99分位数。 -
QUANTILE_999
:与QUANTILE_95
类似,但为99.9分位数。
表events_statements_summary_by_digest
包含以下列。这些既不是分组列也不是摘要列;它们支持语句抽样:
-
QUERY_SAMPLE_TEXT
一个示例SQL语句,它在该行中产生了摘要值。在这个列中,可以通过给定摘要值访问服务器实际看到的语句。这样做的一个用途是运行
EXPLAIN
来分析一个代表频繁出现的摘要值的执行计划。当
QUERY_SAMPLE_TEXT
列被分配值时,QUERY_SAMPLE_SEEN
和QUERY_SAMPLE_TIMER_WAIT
列也被分配值。默认情况下,用于语句显示的最大空间是1024字节。要更改此值,请在服务器启动时设置
performance_ schema_max_sql_text_length
系统变量。 (更改此值会影响其他性能_schema表中的列。请参阅第29.10节,“性能_schema语句摘要和抽样”。)有关语句抽样的信息,请参阅第29.10节,“性能_schema语句摘要和抽样”。
-
QUERY_SAMPLE_ SEEN
表示在第29.10节,“性能_schema语句摘要和抽样”中看到的语句的时间戳。
-
QUERY_SAMPLE_TIMER_WAIT
表示在第29.10节,“性能_schema语句摘要和抽样”中看到的语句等待时间。
表events_statements_summary_by_program
有这些附加总结列:
-
COUNT_STATEMENTS
,SUM_STATEMENTS_WAIT
,MIN_STATEMENTS_WAIT
,AVG_STATEMENTS_WAIT
,MAX_STATEMENTS_WAIT
有关嵌套在存储程序执行期间调用的语句的统计信息。
表prepared_statements_instances
有这些附加总结列:
-
COUNT_EXECUTE
,SUM_TIMER_EXECUTE
,MIN_TIMER_EXECUTE
,AVG_TIMER_EXECUTE
,MAX_TIMER_EXECUTE
为预准备语句执行的聚合统计信息。
性能_schema的总结表有这些索引:
-
events_transactions_summary_by_account_by_event_name
:-
基于(
USER
,HOST
,EVENT_NAME
)的主键。
-
-
events_statements_summary_by_digest
:-
基于(
SCHEMA_NAME
,DIGEST
)的主键。
-
-
events_transactions_summary_by_host_by_event_name
:-
基于(
HOST
,EVENT_NAME
)的主键。
-
-
events_statements_summary_by_program
:-
基于(
OBJECT_TYPE
,OBJECT_SCHEMA
,OBJECT_NAME
)的主键。
-
-
events_statements_summary_by_thread_by_event_name
:-
基于(
THREAD_ID
,EVENT_NAME
)的主键。
-
-
events_transactions_summary_by_user_by_event_name
:-
基于(
USER
,EVENT_NAME
)的主键。
-
-
events_statements_summary_global_by_event_name
:-
基于(
EVENT_NAME
)的主键。
-
TRUNCATE TABLE
允许对性能_schema的总结表进行。它具有这些效果:
-
对于
events_statements_summary_by_digest
,它删除了行。 -
对于其他未聚合的总结表,不是基于帐户、主机或用户的,截断重置总结列为零,而不是删除行。
-
对于其他聚合的总结表,基于帐户、主机或用户的,截断删除了没有连接的帐户、主机或用户的行,并将剩余行的总结列重置为零。
此外,每个根据帐户、主机、用户或线程聚合的语句摘要表都隐式地被连接表的截断或events_statements_summary_global_by_event_name
表的截断所限制。有关详细信息,请参阅第29.12.8节,“性能_schema连接表”。
此外,截断events_statements_summary_by_digest
表会隐式地截断events_statements_histogram_by_digest
表,截断events_statements_summary_global_by_event_name
表会隐式地截断events_statements_histogram_global
表。
如果启用了statements_digest
消费者,语句完成时对events_statements_summary_by_digest
表的聚合如下。当一个语句完成时,聚合基于该语句的DIGEST
值计算。
-
如果已经存在一个具有刚完成语句的
events_statements_summary_by_digest
行,其digest值与刚完成的语句相匹配,那么该语句的统计数据将被聚合到该行中。LAST_SEEN
列将更新为当前时间。 -
如果没有具有刚完成语句的digest值的行,并且表不是满的,会创建一个新的行以用于刚完成的语句。
FIRST_SEEN
和LAST_SEEN
列将初始化为当前时间。 -
如果没有具有刚完成语句的digest值的行,并且表是满的,刚完成的语句的统计数据将被添加到一个特殊的“catch-all”行中,其
DIGEST
值为NULL
,如果必要,将创建该行。若是,则FIRST_SEEN
和LAST_SEEN
列将初始化为当前时间。否则,LAST_
列将更新为当前时间。
具有
DIGEST
值为NULL
的行是维护的,因为性能_schema表有最大大小限制,由于内存约束。具有DIGEST
值为NULL
的行允许不匹配其他行的digest值被计数,即使摘要表是满的,使用一个公共“other”桶。这一行有助于估计摘要是否代表性:
-
具有
DIGEST
值为NULL
的行,其COUNT_STAR
值代表所有digest值的5%,表明摘要表非常代表性;其他行覆盖95%的语句。 -
具有
DIGEST
值为NULL
的行,其COUNT_STAR
值代表所有digest值的50%,表明摘要表不太代表性;其他行只覆盖了语句的一半。很可能DBA应该增加最大表大小,以便更多的行被计数在DIGEST
值为NULL
的行中使用更具体的行。默认情况下,表是自动大小调整的,但如果这个大小太小,可以在服务器启动时设置performance_schema_digests_size
系统变量为更大值。
对于存储程序类型,如果在
setup_objects
表中启用了仪器,events_statements_summary_by_program
对存储程序的统计数据进行维护如下:
-
为对象添加一行,当它首次在服务器中使用时。
-
为对象移除一行,当该对象被删除时。
-
统计数据在对应于对象的行中聚合,随着其执行而增加。
还可以参考第29.4.3节,“事件预过滤”。