PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_DIGEST 用于按语句摘要(DIGEST)维度汇总展示 SQL 语句的执行统计信息,便于用户分析 TDSQL Boundless 集群中各类 SQL 的执行频次、耗时分布、资源消耗以及分布式执行特征。功能
events_statements_summary_by_digest 表按 (SCHEMA_NAME, DIGEST) 唯一键对所有 SQL 语句进行归类聚合,每一行代表同一种 SQL 模板(参数被规范化后形成的语句指纹)的累计执行统计。该表的主要功能如下:提供 SQL 执行频次、累计/最小/平均/最大耗时、锁等待、错误与告警计数等基础指标。
提供扫描行数、临时表创建、全表扫描、排序等执行特征指标,用于识别低效 SQL。
提供 P95、P99、P999 三档耗时分位数,用于评估 SQL 执行的尾部延迟。
提供
SUM_DISTRIBUTED 字段,统计该类 SQL 中以分布式方式执行(一条 SQL 访问多个 Replication Group)的次数,体现 TDSQL Boundless 分布式执行特性。提供查询样本(
QUERY_SAMPLE_TEXT)及其采集时间戳和耗时,便于查看代表性 SQL 的真实文本。说明:
用户不需要将
performance_schema 系统变量设置为 ON,即可查询本表。可通过 TRUNCATE TABLE performance_schema.events_statements_summary_by_digest 清空统计数据。字段说明
字段名 | 类型 | 描述 |
SCHEMA_NAME | varchar(64) | 语句所属的数据库名。如果语句未指定库名,则为 NULL。 |
DIGEST | varchar(64) | SQL 语句摘要的哈希值,即同一语句模板的唯一标识。 |
DIGEST_TEXT | longtext | 规范化后的 SQL 语句模板文本,常量值会被替换为 ?。 |
COUNT_STAR | bigint unsigned | 该模板 SQL 的累计执行次数。 |
SUM_TIMER_WAIT | bigint unsigned | 该模板 SQL 的累计执行耗时,单位为皮秒(ps)。 |
MIN_TIMER_WAIT | bigint unsigned | 该模板 SQL 的最小单次执行耗时,单位为皮秒。 |
AVG_TIMER_WAIT | bigint unsigned | 该模板 SQL 的平均单次执行耗时,单位为皮秒。 |
MAX_TIMER_WAIT | bigint unsigned | 该模板 SQL 的最大单次执行耗时,单位为皮秒。 |
SUM_LOCK_TIME | bigint unsigned | 该模板 SQL 的累计锁等待时间,单位为皮秒。 |
SUM_ERRORS | bigint unsigned | 该模板 SQL 累计执行失败的次数。 |
SUM_WARNINGS | bigint unsigned | 该模板 SQL 累计产生告警的次数。 |
SUM_ROWS_AFFECTED | bigint unsigned | 该模板 SQL 累计影响的行数(INSERT、UPDATE、DELETE 等)。 |
SUM_ROWS_SENT | bigint unsigned | 该模板 SQL 累计返回给客户端的行数。 |
SUM_ROWS_EXAMINED | bigint unsigned | 该模板 SQL 累计扫描的行数。 |
SUM_CREATED_TMP_DISK_TABLES | bigint unsigned | 该模板 SQL 累计创建的磁盘临时表数量。 |
SUM_CREATED_TMP_TABLES | bigint unsigned | 该模板 SQL 累计创建的临时表(含内存临时表)数量。 |
SUM_SELECT_FULL_JOIN | bigint unsigned | 该模板 SQL 累计因未使用索引而触发全表关联的次数。 |
SUM_SELECT_FULL_RANGE_JOIN | bigint unsigned | 该模板 SQL 累计触发全范围关联(range search)的次数。 |
SUM_SELECT_RANGE | bigint unsigned | 该模板 SQL 累计在第一张表上使用范围扫描的次数。 |
SUM_SELECT_RANGE_CHECK | bigint unsigned | 该模板 SQL 累计触发逐行范围检查的次数,通常表明 JOIN 索引选择不佳。 |
SUM_SELECT_SCAN | bigint unsigned | 该模板 SQL 累计在第一张表上进行全表扫描的次数。 |
SUM_SORT_MERGE_PASSES | bigint unsigned | 该模板 SQL 累计的归并排序合并轮数。 |
SUM_SORT_RANGE | bigint unsigned | 该模板 SQL 累计基于范围扫描进行排序的次数。 |
SUM_SORT_ROWS | bigint unsigned | 该模板 SQL 累计参与排序的行数。 |
SUM_SORT_SCAN | bigint unsigned | 该模板 SQL 累计基于全表扫描进行排序的次数。 |
SUM_NO_INDEX_USED | bigint unsigned | 该模板 SQL 累计未使用任何索引的执行次数。 |
SUM_NO_GOOD_INDEX_USED | bigint unsigned | 该模板 SQL 累计因优化器认为没有合适索引而未走索引的执行次数。 |
SUM_DISTRIBUTED | bigint unsigned | 该模板 SQL 中以分布式方式执行的累计次数。当一次执行涉及修改超过一个 Replication Group 时计为1,否则计为0。该字段为 TDSQL Boundless 自研字段。 |
FIRST_SEEN | timestamp(6) | 该模板 SQL 首次被记录的时间。 |
LAST_SEEN | timestamp(6) | 该模板 SQL 最近一次被记录的时间。 |
QUANTILE_95 | bigint unsigned | 该模板 SQL 执行耗时的 P95 分位数,单位为皮秒。 |
QUANTILE_99 | bigint unsigned | 该模板 SQL 执行耗时的 P99 分位数,单位为皮秒。 |
QUANTILE_999 | bigint unsigned | 该模板 SQL 执行耗时的 P999 分位数,单位为皮秒。 |
QUERY_SAMPLE_TEXT | longtext | 该模板 SQL 的代表性原始语句文本(保留参数值),可用于复现执行。 |
QUERY_SAMPLE_SEEN | timestamp(6) | 采集 QUERY_SAMPLE_TEXT 时的时间戳。 |
QUERY_SAMPLE_TIMER_WAIT | bigint unsigned | 采集 QUERY_SAMPLE_TEXT 时该次执行的耗时,单位为皮秒。 |
说明:
表中所有耗时类字段(
*_TIMER_WAIT、SUM_LOCK_TIME、QUANTILE_*、QUERY_SAMPLE_TIMER_WAIT)的单位均为皮秒,1秒等于 1,000,000,000,000皮秒。示例
示例1:查询 SQL 执行统计概览
查询当前实例中执行次数最多的前10个 SQL 模板:
SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR,SUM_TIMER_WAIT / 1000000000 AS SUM_TIMER_MS,AVG_TIMER_WAIT / 1000000000 AS AVG_TIMER_MSFROM performance_schema.events_statements_summary_by_digestORDER BY COUNT_STAR DESCLIMIT 10;
示例2:查看 SQL 执行的尾部延迟
查询 P99 耗时超过100ms的 SQL 模板,定位慢查询:
SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR,QUANTILE_95 / 1000000000 AS P95_MS,QUANTILE_99 / 1000000000 AS P99_MS,QUANTILE_999 / 1000000000 AS P999_MSFROM performance_schema.events_statements_summary_by_digestWHERE QUANTILE_99 > 100000000000ORDER BY QUANTILE_99 DESC;
示例3:识别低效 SQL
查询全表扫描或未使用索引的 SQL 模板:
SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR,SUM_NO_INDEX_USED, SUM_SELECT_SCAN, SUM_ROWS_EXAMINEDFROM performance_schema.events_statements_summary_by_digestWHERE SUM_NO_INDEX_USED > 0 OR SUM_SELECT_SCAN > 0ORDER BY SUM_ROWS_EXAMINED DESC;
示例4:查看分布式执行统计
SUM_DISTRIBUTED 字段统计 SQL 中以分布式方式执行(涉及多于一个参与节点)的次数。下面通过一个具体场景演示其行为:CREATE DATABASE db;CREATE TABLE db.t1 (a INT PRIMARY KEY, b VARCHAR(30));CREATE TABLE db.t2 (a INT PRIMARY KEY, b VARCHAR(30));-- 将 t1 和 t2 分布到不同的 replication groupUSE performance_schema;TRUNCATE TABLE events_statements_summary_by_digest;USE db;INSERT INTO t1 VALUES (111, 222);INSERT INTO t2 VALUES (111, 222);UPDATE t1, t2 SET t1.b = 333, t2.b = 333 WHERE t1.a = 111 AND t2.a = 111;SELECT DIGEST_TEXT, COUNT_STAR, SUM_DISTRIBUTEDFROM performance_schema.events_statements_summary_by_digestWHERE SCHEMA_NAME = 'db';
输出结果:
DIGEST_TEXT COUNT_STAR SUM_DISTRIBUTEDINSERT INTO `t1` VALUES (...) 1 0INSERT INTO `t2` VALUES (...) 1 0UPDATE `t1` , `t2` SET `t1` . `b` = ? , `t2` . `b` = ? WHERE `t1` . `a` = ? AND `t2` . `a` = ? 1 1
结果说明:
两条
INSERT 语句仅访问单个表,且每条语句仅涉及一个参与节点,因此 SUM_DISTRIBUTED 为 0。UPDATE 语句同时更新位于不同 replication group 的 t1 和 t2,涉及多于一个参与节点,因此 SUM_DISTRIBUTED 为 1。示例 5:查看代表性 SQL 文本
查询某条 SQL 模板的最近一次代表性执行文本及耗时:
SELECT DIGEST, DIGEST_TEXT, QUERY_SAMPLE_TEXT,QUERY_SAMPLE_SEEN,QUERY_SAMPLE_TIMER_WAIT / 1000000000 AS SAMPLE_TIMER_MSFROM performance_schema.events_statements_summary_by_digestWHERE DIGEST = '<指定的 DIGEST 值>'\\G
示例 6:清空统计数据
如需重置统计数据(例如在性能压测前),可执行:
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;