Spanner 提供了内置表,用于记录表(包括更改流表)和索引的读取(或查询)、写入和删除操作统计信息。借助表操作统计信息,您可以执行以下操作:
找出写入流量增加与存储空间增加相对应的表。
识别存在意外读取、写入和删除流量的表。
确定使用频率较高的表。
当您查询或写入表时,无论访问的行数如何,相应表的操作计数都会递增 1。
您可以通过 System Insights 图表中的 Operations per second
、Operations per second by API method
和其他相关指标来监控数据库的每秒总操作数指标。
可用性
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));