事务统计信息表

Cloud Spanner 提供内置表,用于存储事务的相关统计信息。您可以使用 SQL 语句从这些 SPANNER_SYS.TXN_STATS* 表中检索统计信息。

何时使用事务统计信息

事务统计信息在调查性能问题时很有用。例如,您可以检查是否有任何运行缓慢的事务可能会影响数据库中的性能或每秒查询次数 (QPS)。另一种情况是,您的客户端应用遇到较长事务执行延迟时间。分析事务统计信息可能有助于发现潜在的瓶颈,例如对列的大量更新,这可能会影响延迟时间。

可用情况

SPANNER_SYS 数据只能通过 SQL 接口获得(例如通过 executeQuerygcloud spanner databases execute-sql 接口);Cloud Spanner 提供的其他单一读取方法不支持 SPANNER_SYS

按事务分组的延迟时间统计信息

下面的表跟踪了特定时间段内 TOP 资源消耗事务的统计信息。

  • SPANNER_SYS.TXN_STATS_TOP_MINUTE:以1 分钟为间隔聚合的事务统计信息。

  • SPANNER_SYS.TXN_STATS_TOP_10MINUTE:以 10 分钟为间隔聚合的事务统计信息。

  • SPANNER_SYS.TXN_STATS_TOP_HOUR:以 1 小时为间隔聚合的事务统计信息。

这些表具有以下属性:

  • 每个表包含表名指定的非重叠时间段长度的数据。

  • 时间段基于时钟时间。1 分钟时间段结束于整点分钟,10 分钟时间段结束于整点 10 分钟(自当前小时数开始),1 小时时间段结束于整点小时数。

    例如,在上午 11:59:30,SQL 查询可用的最近时间段为:

    • 1 分钟:上午 11:58:01-11:59:00
    • 10 分钟:上午 11:40:01-11:50:00
    • 1 小时:上午 10:00:01–11:00:00
  • Cloud Spanner 按事务的 FPRINT 对统计信息进行分组。FPRINT 是根据事务涉及的操作计算的哈希值。

  • 由于统计信息是根据 FPRINT 进行分组的,因此如果在同一时间间隔内多次执行同一事务,我们仍会在这些表中看到该事务的一个条目。

  • 每行包含 Cloud Spanner 在指定时间段内捕获的特定事务的所有执行结果的统计信息。

如果 Cloud Spanner 无法存储该时间段内在这些表中运行的所有事务的统计信息,则系统会优先处理延迟时间最长的事务、提交尝试以及在指定时间段内写入的字节。

表架构

列名 类型 说明
INTERVAL_END TIMESTAMP 所含事务执行发生的时间段结束。
FPRINT INT64 指纹是根据事务涉及的操作计算的哈希值。INTERVAL_ENDFPRINT 共同充当这些表的唯一键。
READ_COLUMNS ARRAY<STRING> 事务读取的一组列。
WRITE_CONSTRUCTIVE_COLUMNS ARRAY<STRING> 事务以构造方式写入(即分配给新值)的一组列。
WRITE_DELETE_TABLES ARRAY<STRING> 已删除行或被事务替换的行的表集。
COMMIT_ATTEMPT_COUNT INT64 事务的总提交尝试次数。
COMMIT_FAILED_PRECONDITION_COUNT INT64 事务的前提条件总失败次数 (FAILED_PRECONDITION)。
COMMIT_ABORT_COUNT INT64 事务中止提交的次数。
AVG_PARTICIPANTS FLOAT64 每次提交尝试的平均参与者人数。如需详细了解参与者,请参阅 Cloud Spanner 的读写生命周期
AVG_TOTAL_LATENCY_SECONDS FLOAT64 从事务的首次操作到提交/中止的平均秒数。
AVG_COMMIT_LATENCY_SECONDS FLOAT64 执行提交操作所需的平均秒数。
AVG_BYTES FLOAT64 事务写入的平均字节数。

示例查询

本部分提供了几个可检索事务统计信息的示例 SQL 语句。您可以使用客户端库gcloud 命令行工具或 Cloud Console 运行这些 SQL 语句。

列出指定时间段内每个事务的基本统计信息

以下查询会返回前一分钟内热门事务的原始数据。

SELECT fprint,
       read_columns,
       write_constructive_columns,
       write_delete_tables,
       avg_total_latency_seconds,
       avg_commit_latency_seconds,
       avg_bytes
FROM spanner_sys.txn_stats_top_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.txn_stats_top_minute);
查询输出
fprint read_columns write_constructive_columns write_delete_tables avg_total_latency_seconds avg_commit_latency_seconds avg_bytes
40015598317 [] ["Routes"] ["Users"] 0.006578737 0.006547737 25286
20524969030 ["id", "no"] [] [] 0.001732442 0.000247442 0
77848338483 [] [] ["Cars", "Routes"] 0.033467418 0.000251418 0

列出平均提交延迟时间最长的事务

以下查询返回前一小时平均提交延迟时间较长(按从长到短排列)的事务。

SELECT fprint,
       read_columns,
       write_constructive_columns,
       write_delete_tables,
       avg_total_latency_seconds,
       avg_commit_latency_seconds,
       avg_bytes
FROM spanner_sys.txn_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.txn_stats_top_hour)
ORDER BY avg_commit_latency_seconds DESC;
查询输出
fprint read_columns write_constructive_columns write_delete_tables avg_total_latency_seconds avg_commit_latency_seconds avg_bytes
40015598317 [] ["Routes"] ["Users"] 0.006578737 0.006547737 25286
77848338483 [] [] ["Cars", "Routes"] 0.033467418 0.000251418 0
20524969030 ["id", "no"] [] [] 0.001732442 0.000247442 0

查找读取特定列的事务的平均延迟时间

以下查询返回从 1 小时统计信息读取 ADDRESS(地址)列的事务的平均延迟时间信息:

SELECT fprint,
       read_columns,
       write_constructive_columns,
       write_delete_tables,
       avg_total_latency_seconds
FROM spanner_sys.txn_stats_top_hour
WHERE 'ADDRESS' IN UNNEST(read_columns)
ORDER BY avg_total_latency_seconds DESC;
查询输出
fprint read_columns write_constructive_columns write_delete_tables avg_total_latency_seconds
77848338483 ["ID", "ADDRESS"] [] ["Cars", "Routes"] 0.033467418
40015598317 ["ID", "NAME", "ADDRESS"] [] ["Users"] 0.006578737

按修改的平均字节数列出事务

以下查询返回过去一小时内采样的事务,按照事务修改的平均字节数进行排序。

SELECT fprint,
       read_columns,
       write_constructive_columns,
       write_delete_tables,
       avg_bytes
FROM spanner_sys.txn_stats_top_hour
ORDER BY avg_bytes DESC;
查询输出
fprint read_columns write_constructive_columns write_delete_tables avg_bytes
40015598317 [] [] ["Users"] 25286
77848338483 [] [] ["Cars", "Routes"] 12005
20524969030 ["ID", "ADDRESS"] [] ["Users"] 10923

聚合统计信息

SPANNER_SYS 还包含用于存储 Cloud Spanner 在特定时间段内捕获其统计信息的所有事务的汇总数据:

  • SPANNER_SYS.TXN_STATS_TOTAL_MINUTE:1 分钟时间段内所有事务的汇总统计信息
  • SPANNER_SYS.TXN_STATS_TOTAL_10MINUTE:10 分钟时间段内所有事务的汇总统计信息
  • SPANNER_SYS.TXN_STATS_TOTAL_HOUR:1 小时时间段内所有事务的汇总统计信息

汇总统计信息表具有以下属性:

  • 每个表包含表名指定的非重叠时间段长度的数据。

  • 时间段基于时钟时间。1 分钟时间段结束于整点分钟,10 分钟时间段结束于整点 10 分钟(自当前小时数开始),1 小时时间段结束于整点小时数。

    例如,在上午 11:59:30,SQL 查询可用的汇总事务统计信息的最近时间段为:

    • 1 分钟:上午 11:58:01-11:59:00
    • 10 分钟:上午 11:40:01-11:50:00
    • 1 小时:上午 10:00:01–11:00:00
  • 每行包含在指定时间段内通过数据库执行的所有事务的聚合统计信息。每个时间段只有一行。

  • SPANNER_SYS.TXN_STATS_TOTAL_* 表中捕获的统计信息可能包含 Cloud Spanner 在 SPANNER_SYS.TXN_STATS_TOP_* 表中未捕获的事务。

表架构

列名 类型 说明
INTERVAL_END TIMESTAMP 捕获此统计信息的时间段结束。
COMMIT_ATTEMPT_COUNT INT64 事务的总提交尝试次数。
COMMIT_FAILED_PRECONDITION_COUNT INT64 事务的前提条件总失败次数 (FAILED_PRECONDITION)。
COMMIT_ABORT_COUNT INT64 事务中止提交的次数。
AVG_PARTICIPANTS FLOAT64 每次提交尝试的平均参与者人数。如需详细了解参与者,请参阅 Cloud Spanner 的读写生命周期
AVG_TOTAL_LATENCY_SECONDS FLOAT64 从事务的首次操作到提交/中止的平均秒数。
AVG_COMMIT_LATENCY_SECONDS FLOAT64 执行提交操作所需的平均秒数。
AVG_BYTES FLOAT64 事务写入的平均字节数。

示例查询

本部分提供了几个可检索事务统计信息的示例 SQL 语句。您可以使用客户端库gcloud 命令行工具或 Cloud Console 运行这些 SQL 语句。

查找指定时间段内事务的总提交尝试次数

以下查询可返回在前一个整 1 分钟时间段内所有事务的提交尝试总次数:

SELECT interval_end,
       commit_attempt_count
FROM spanner_sys.txn_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.txn_stats_total_minute)
ORDER BY interval_end;
查询输出
interval_end commit_attempt_count
2020-01-17 11:46:00-08:00 21

请注意,结果中只有一行,因为聚合的统计信息在任何时间段内每个 interval_end 只有一个条目。

查找所有事务的总提交延迟时间

以下查询返回过去 10 分钟内所有事务的总提交延迟时间:

SELECT (avg_commit_latency_seconds * commit_attempt_count / 60 / 60)
  AS total_commit_latency_hours
FROM spanner_sys.txn_stats_total_10minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.txn_stats_total_10minute);
查询输出
total_commit_latency_hours
0.8967

请注意,结果中只有一行,因为聚合的统计信息在任何时间段内每个 interval_end 只有一个条目。

数据保留

Cloud Spanner 至少为每个表保留以下时间段内的数据:

  • SPANNER_SYS.TXN_STATS_TOP_MINUTESPANNER_SYS.TXN_STATS_TOTAL_MINUTE:前 6 个小时中的时间段。

  • SPANNER_SYS.TXN_STATS_TOP_10MINUTESPANNER_SYS.TXN_STATS_TOTAL_10MINUTE:前 4 天中的时间段。

  • SPANNER_SYS.TXN_STATS_TOP_HOURSPANNER_SYS.TXN_STATS_TOTAL_HOUR:前 30 天中的时间段。

后续步骤