表操作统计信息

Spanner 提供了内置表,用于记录表(包括更改流表)和索引的读取(或查询)、写入和删除操作统计信息。利用表操作统计信息,您可以执行以下操作:

  • 找出写入流量随着存储空间增加而增加的表。

  • 识别具有意外读取、写入和删除流量的表。

  • 识别频繁使用的表。

当您对表执行查询或写入操作时,无论访问的行数是多少,表的相应操作计数都会增加 1。

您可以使用 Operations per secondOperations per second by API methodSystem Insights 图表中的其他相关指标来监控数据库的总体每秒操作次数指标。

可用性

Spanner 在 SPANNER_SYS 架构中提供表操作统计信息。SPANNER_SYS 数据只能通过 SQL 接口访问。例如:

  • Google Cloud 控制台中的数据库 Spanner Studio 页面

  • gcloud spanner databases execute-sql 命令

  • executeQuery API

Spanner 提供的其他单次读取方法不支持 SPANNER_SYS

表操作统计信息

下表会跟踪特定时间段内的表和索引的读取(或查询)、写入和删除统计信息:

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE:1 分钟时间段内的操作
  • SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE:10 分钟时间段内的操作
  • SPANNER_SYS.TABLE_OPERATIONS_STATS_HOUR:1 小时时间段内的操作

这些表具有以下属性:

  • 每个表包含表名称指定的非重叠时间间隔的数据。

  • 间隔基于时钟时间。1 分钟间隔从分钟开始,10 分钟间隔从当前小时开始每 10 分钟开始,1 小时间隔从当前小时开始计算。

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

    • 1 分钟:上午 11:58:00–11:58:59
    • 10 分钟:上午 11:40:00–11:49:59
    • 1 小时:上午 10:00:00–10:59:59

所有表操作统计信息表的架构

列名 类型 说明
INTERVAL_END TIMESTAMP 收集表大小的时间间隔结束。
TABLE_NAME STRING 表或索引的名称。
READ_QUERY_COUNT INT64 从表中读取的查询或读取次数。
WRITE_COUNT INT64 写入表的查询数。
DELETE_COUNT INT64 对表执行删除的查询数量。

如果使用变更将数据插入数据库,对于插入语句访问的每个表,write_count 都会递增 1。此外,如果查询在不扫描底层表的情况下访问索引,则只会递增索引上的 read_query_count

数据保留

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

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

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

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

示例查询

本部分包含几个检索汇总表操作统计信息的 SQL 语句示例。您可以使用客户端库gcloud spanner 运行这些 SQL 语句。

查询最近时间间隔内写入操作次数最多的表和索引

    SELECT interval_end,
          table_name,
          write_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY write_count DESC;
  

查询最近时间间隔内删除操作最多的表和索引

    SELECT interval_end,
          table_name,
          delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY delete_count DESC;
  

查询在最近一段时间内读取和查询操作次数最多的表和索引

    SELECT interval_end,
          table_name,
          read_query_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY read_query_count DESC;
  

查询表在过去 6 小时内的使用情况

    SELECT interval_end,
           read_query_count,
           write_count,
           delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE table_name = table_name
    ORDER BY interval_end DESC;
    

其中:

  • table_name 必须是数据库中的现有表或索引。

查询表在过去 14 天内的使用情况

GoogleSQL

SELECT interval_end,
       read_query_count,
       write_count,
       delete_count
FROM spanner_sys.table_operations_stats_hour
WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)
      AND table_name = table_name
ORDER BY interval_end DESC;

其中:

  • table_name 必须是数据库中的现有表或索引。

查询过去 24 小时内未使用的表和索引

GoogleSQL

(SELECT t.table_name
 FROM  information_schema.tables AS t
 WHERE t.table_catalog = ""
   AND t.table_schema = ""
   AND t.table_type = "BASE TABLE"
 UNION ALL
 SELECT cs.change_stream_name
 FROM information_schema.change_streams cs
 WHERE cs.change_stream_catalog = ""
   AND cs.change_stream_schema = ""
 UNION ALL
 SELECT idx.index_name
 FROM information_schema.indexes idx
 WHERE idx.index_type = "INDEX"
   AND idx.table_catalog = ""
   AND idx.table_schema = "")
 EXCEPT ALL
(SELECT  DISTINCT(table_name)
 FROM spanner_sys.table_operations_stats_hour
 WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -24 HOUR));

后续步骤