列操作统计信息

Spanner 提供了一些内置表,用于记录表列的读取、查询和写入操作统计信息。借助列操作统计信息,您可以执行以下操作:

  • 确定存在意外读取、查询和写入流量的列。

  • 确定经常使用的列。

当您查询或写入列时,无论访问的行数有多少,Spanner 都会将该列的相应操作计数递增 1。

您可以使用系统数据分析图表中的每秒操作次数、按 API 方法划分的每秒操作次数和其他相关指标来监控数据库的总体使用情况。

访问列操作统计信息

Spanner 在 SPANNER_SYS 架构中提供列操作统计信息。您可以使用以下方式访问 SPANNER_SYS 数据:

Spanner 提供的以下单次读取方法不支持 SPANNER_SYS

  • 对表中的单行或多行执行强读。
  • 从表中的单行或多行执行过时数据读取。
  • 从二级索引中的单行或多行读取。

如需了解详情,请参阅单次读取方法

列操作统计信息

以下表跟踪特定时间段内列的读取、查询和写入统计信息:

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE:1 分钟间隔内的操作
  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE:10 分钟间隔内的操作
  • SPANNER_SYS.COLUMN_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 表或索引的名称。
COLUMN_NAME STRING 列的名称。
READ_COUNT INT64 从相应列读取的次数。
QUERY_COUNT INT64 从相应列读取数据的查询数量。
WRITE_COUNT INT64 向表进行写入的查询数量。
IS_QUERY_CACHE_MEMORY_CAPPED BOOL 统计信息收集是否因内存压力而受到限制。

如果您使用变更将数据插入数据库,则 Spanner 会针对插入语句访问的每个表将 WRITE_COUNT 递增 1。此外,如果查询访问索引而不扫描底层表,则只会使索引的 QUERY_COUNT 递增。

数据保留

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

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE:涵盖前 6 个小时的间隔。

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE:涵盖前 4 天的间隔。

  • SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR:涵盖前 30 天的间隔。

示例查询

本部分提供了几个可检索汇总列操作统计信息的示例 SQL 语句。您可以使用客户端库Google Cloud CLI 运行这些 SQL 语句。

查询最近间隔内写入操作次数最多的表列

GoogleSQL

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

PostgreSQL

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

查询最近间隔内查询操作次数最多的列

GoogleSQL

    SELECT interval_end,
          table_name,
          column_name,
          query_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.column_operations_stats_minute)
    ORDER BY query_count DESC;

PostgreSQL

    SELECT interval_end,
          table_name,
          column_name,
          query_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.column_operations_stats_minute)
    ORDER BY query_count DESC;

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

GoogleSQL

    SELECT interval_end,
          read_count,
          query_count,
          write_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE table_name = "table_name"
          AND column_name = "column_name"
    ORDER BY interval_end DESC;
    

其中:

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

PostgreSQL

    SELECT interval_end,
          read_count,
          query_count,
          write_count
    FROM spanner_sys.column_operations_stats_minute
    WHERE table_name = 'table_name'
          AND column_name = 'column_name'
    ORDER BY interval_end DESC;
    

其中:

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

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

GoogleSQL

SELECT interval_end,
       read_count,
       query_count,
       write_count
FROM spanner_sys.column_operations_stats_hour
WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)
      AND table_name = "table_name"
      AND column_name = "column_name"
ORDER BY interval_end DESC;

进行以下替换:

  • table_name:数据库中的表或索引名称。
  • column_name:表中的列名称。

PostgreSQL

SELECT interval_end,
   read_count,
   query_count,
   write_count
FROM spanner_sys.column_operations_stats_hour
WHERE interval_end > spanner.timestamptz_subtract(now(), '14 DAY')
  AND table_name = 'table_name'
  AND column_name = 'column_name'
ORDER BY interval_end DESC;

进行以下替换:

  • table_name:数据库中的表或索引名称。
  • column_name:表中的列名称。

后续步骤