查询统计信息

Cloud Spanner 提供内置表,表中存储许多关于 CPU 使用率最高的查询和所有查询总计的统计信息。Google Cloud Console 使用这些 SPANNER_SYS.QUERY_STATS* 表中的数据生成其查询统计信息视图,但您也可以使用 SQL 语句从表中检索统计信息。

用量

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

按查询分组的 CPU 使用率

下面的表跟踪特定时间段内 CPU 使用率最高的查询:

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTE:1 分钟时间段内的查询
  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTE:10 分钟时间段内的查询
  • SPANNER_SYS.QUERY_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 按 SQL 查询的文本对统计信息进行分组。如果是使用查询参数的查询,则 Cloud Spanner 会将该查询的所有执行结果放在一行。如果是使用字符串字面量的查询,则只有查询文本完全相同时,Cloud Spanner 才会对统计信息进行分组;当查询文本不同时,每个查询都会显示为单独的行。

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

  • 如果 Cloud Spanner 无法存储在某时间段内运行的所有查询,则系统会优先存储在指定时间段内 CPU 使用率最高的查询。

表架构

列名 类型 说明
INTERVAL_END TIMESTAMP 包括的查询执行时所处的时间段的结束时间。
TEXT STRING SQL 查询文本,被截断至 64KB 左右。
TEXT_TRUNCATED BOOL 查询文本是否被截断。
TEXT_FINGERPRINT INT64 查询文本的哈希值。
EXECUTION_COUNT INT64 Cloud Spanner 在时间段内查看查询的次数。
AVG_LATENCY_SECONDS FLOAT64 数据库中每个查询执行的平均时间长度(以秒为单位)。该平均值不包括结果集编码和传输时间以及开销。
AVG_ROWS FLOAT64 查询返回的行数的平均值。
AVG_BYTES FLOAT64 查询返回的数据字节数的平均值,不包括传输编码开销。
AVG_ROWS_SCANNED FLOAT64 查询扫描的行数的平均值,不包括已删除的值。
AVG_CPU_SECONDS FLOAT64 Cloud Spanner 在执行查询的所有操作上使用的 CPU 时间的平均秒数。

聚合统计信息表

还有一些表跟踪 Cloud Spanner 在特定时间段内为其捕获统计信息的所有查询的聚合数据:

  • SPANNER_SYS.QUERY_STATS_TOTAL_MINUTE:1 分钟时间段内的查询
  • SPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE:10 分钟时间段内的查询
  • SPANNER_SYS.QUERY_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
  • 每行包含在指定时间段内通过数据库执行的所有查询的聚合统计信息。每个时间段只有一行。

  • TOTAL 表中捕获的统计信息可能包含 Cloud Spanner 在 TOP 表中未捕获的查询。

表架构

列名 类型 说明
INTERVAL_END TIMESTAMP 包括的查询执行时所处的时间段的结束时间。
EXECUTION_COUNT INT64 Cloud Spanner 在时间段内查看查询的次数。
AVG_LATENCY_SECONDS FLOAT64 数据库中每个查询执行的平均时间长度(以秒为单位)。该平均值不包括结果集编码和传输时间以及开销。
AVG_ROWS FLOAT64 查询返回的行数的平均值。
AVG_BYTES FLOAT64 查询返回的数据字节数的平均值,不包括传输编码开销。
AVG_ROWS_SCANNED FLOAT64 查询扫描的行数的平均值,不包括已删除的值。
AVG_CPU_SECONDS FLOAT64 Cloud Spanner 在执行查询的所有操作上使用的 CPU 时间的平均秒数。

数据保留

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

  • SPANNER_SYS.QUERY_STATS_TOP_MINUTESPANNER_SYS.QUERY_STATS_TOTAL_MINUTE:前 6 个小时中的时间段。

  • SPANNER_SYS.QUERY_STATS_TOP_10MINUTESPANNER_SYS.QUERY_STATS_TOTAL_10MINUTE:前 4 天中的时间段。

  • SPANNER_SYS.QUERY_STATS_TOP_HOURSPANNER_SYS.QUERY_STATS_TOTAL_HOUR:前 30 天中的时间段。

示例查询

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

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

以下查询可返回前一分钟内顶级查询的原始数据:

SELECT text,
       interval_end,
       execution_count,
       avg_latency_seconds,
       avg_rows,
       avg_bytes,
       avg_rows_scanned,
       avg_cpu_seconds
FROM spanner_sys.query_stats_top_minute
ORDER BY interval_end;

列出 CPU 使用率最高的查询

以下查询可返回前一小时 CPU 使用率最高的查询:

SELECT text,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

查找指定时间段内的总执行次数

以下查询可返回在前一个整 1 分钟时间段内执行的查询总数:

SELECT interval_end,
       execution_count
FROM spanner_sys.query_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_minute)
ORDER BY interval_end;

查找查询的平均延迟

以下查询可返回特定查询的平均延迟时间信息:

SELECT avg_latency_seconds
FROM spanner_sys.query_stats_top_hour
WHERE text LIKE "SELECT x FROM table WHERE x=@foo;";

查找扫描最多数据的查询

要衡量某查询扫描的数据量,您可以使用该查询扫描的行数作为统计方式。以下查询可返回前一小时执行的查询所扫描的行数:

SELECT text,
       execution_count,
       avg_rows_scanned
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY avg_rows_scanned DESC;

所有查询的 CPU 总使用时间

以下查询可返回前一小时使用的 CPU 小时数:

SELECT (avg_cpu_seconds * execution_count / 60 / 60)
  AS total_cpu_hours
FROM spanner_sys.query_stats_total_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_total_hour);

后续步骤