活跃的分区数据操纵语言 (DML) 可实时显示数据库中活跃的分区 DML 的进度。
Spanner 提供了一个内置表 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS
,该表列出了正在运行的分区 DML 及其进度。
本页面将详细介绍该表,并介绍一些使用该表的示例查询,最后演示如何使用这些查询来帮助缓解由活跃分区 DML 引发的问题。本页面上的信息适用于 GoogleSQL 方言数据库和 PostgreSQL 方言数据库。
访问活跃的分区 DML 统计信息
Spanner 在 SPANNER_SYS
架构中提供活跃的分区 DML 统计信息。您可以使用以下方式访问 SPANNER_SYS
数据:
Google Cloud 控制台中的数据库 Spanner Studio 页面。
Spanner 提供的以下单次读取方法不支持 SPANNER_SYS
:
- 对表中的单行或多行执行强读。
- 从表中的单行或多行执行过时数据读取。
- 从二级索引中的单行或多行读取。
ACTIVE_PARTITIONED_DMLS
SPANNER_SYS.ACTIVE_PARTITIONED_DMLS
返回按开始时间排序的活跃分区 DML 的列表。
表架构
下表展示了 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS 的表架构。
列名 | 类型 | 说明 |
---|---|---|
TEXT |
STRING |
分区 DML 查询语句文本。 |
TEXT_FINGERPRINT |
INT64 |
指纹是分区 DML 文本的哈希值。 |
SESSION_ID |
STRING |
执行分区 DML 的会话的 ID。删除会话 ID 将会取消查询。 |
NUM_PARTITIONS_TOTAL |
INT64 |
分区 DML 中的分区总数。 |
NUM_PARTITIONS_COMPLETE |
INT64 |
分区 DML 已完成的分区数。 |
NUM_TRIVIAL_PARTITIONS_COMPLETE |
INT64 |
未处理任何行的完整分区数。 |
PROGRESS |
DOUBLE |
分区 DML 的进度计算方法为:已完成的非平凡分区数除以非平凡分区的总数。 |
ROWS_PROCESSED |
INT64 |
已处理的行数,在每个分区完成后更新。 |
START_TIMESTAMP 。 |
TIMESTAMP |
分区 DML 的开始时间上限。 |
LAST_UPDATE_TIMESTAMP |
TIMESTAMP |
分区 DML 上次取得进展时的时间戳。在分区完成后更新。 |
示例查询
您可以使用客户端库、Google Cloud CLI 或Google Cloud 控制台运行下列示例 SQL 语句。
列出最早运行的查询
以下查询将返回正在运行的分区 DML 的列表,按查询的开始时间排序。
SELECT text,
session_id,
num_partitions_total,
num_partitions_complete,
num_trivial_partitions_complete,
progress,
rows_processed,
start_timestamp,
last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC;
文本 | session_id | num_partitions_total | num_partitions_complete | num_trivial_partitions_complete | #googlecloudcertifiedprogress 标签 | rows_processed | start_timestamp | last_update_timestamp |
---|---|---|---|---|---|---|---|---|
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 | 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 | 27 | 15 | 3 | 50.00% | 2398654 | 2024-01-21 15:56:30.498744-08:00 | 2024-01-22 15:56:39.049799-08:00 |
UPDATE Singers SET LastName = NULL WHERE LastName = '' | 0028284f-0190-52f9-b396-aa588e034806 | 8 | 4 | 4 | 00.00% | 0 | 2024-01-22 15:55:18.498744-08:00 | 2024-01-22 15:56:28.049799-08:00 |
DELETE from Singers WHERE SingerId > 1000000 | 0071a85e-7e5c-576b-8a17-f9bc3d157eea | 8 | 4 | 3 | 20.00% | 238654 | 2024-01-22 15:56:30.498744-08:00 | 2024-01-22 15:56:19.049799-08:00 |
UPDATE Singers SET MarketingBudget = 1000 WHERE true | 036097a9-91d4-566a-a399-20c754eabdc2 | 8 | 5 | 0 | 62.50% | 238654 | 2024-01-22 15:57:47.498744-08:00 | 2024-01-22 15:57:39.049799-08:00 |
限制
使用 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS
表存在以下限制:
PROGRESS
、ROWS_PROCESSED
和LAST_UPDATE_TIMESTAMP
结果会在完成的分区边界处递增,因此分区 DML 可能会持续更新行,而这三个字段中的值保持不变。如果分区 DML 中有数百万个分区,则
PROGRESS
列中的值可能无法捕获所有增量进度。使用NUM_PARTITIONS_COMPLETE
和NUM_TRIVIAL_PARTITIONS_COMPLETE
来表示更精细的进度。如果您使用 RPC 请求取消分区 DML,则取消的分区 DML 可能仍会显示在表中。如果您使用会话删除功能取消分区 DML,系统会立即从表中移除该 DML。 如需了解详情,请参阅删除会话 ID。
使用活跃分区 DML 查询数据排查高 CPU 利用率的问题
在排查 Spanner 数据库中的延迟问题时,查询统计信息和事务统计信息会提供一些有用的信息。这些工具会提供有关已完成查询的信息。不过,有时需要知道系统中正在运行的程序。例如,在 CPU 利用率很高的情况下,您需要回答以下问题。
- 目前正在运行多少个分区 DML?
- 什么是分区 DML?
- 有多少分区 DML 运行了很长时间?
- 哪个会话正在运行查询?
如果您有上述问题的答案,可以决定采取以下措施。
- 删除执行查询的会话可立即解决问题。
- 降低分区 DML 的频率。
在以下演示中,我们将研究活跃的分区 DML,并确定要采取的行动(如果有的话)。
检索活跃分区 DML 的摘要
在示例场景中,我们发现 CPU 使用率高于正常水平,因此决定运行以下查询来返回活跃分区 DML 的数量。
SELECT count(*) as active_count
FROM spanner_sys.active_partitioned_dmls;
该查询会产生以下结果。
active_count |
---|
22 |
列出最热门的 2 个最早运行的分区 DML
然后,我们可以运行查询,以查找有关前 2 个最早运行的分区 DML 的更多信息,这些分区 DML 按开始时间排序。
SELECT text,
session_id,
num_partitions_total,
num_partitions_complete,
num_trivial_partitions_complete,
progress,
rows_processed,
start_timestamp,
last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC LIMIT 2;
文本 | session_id | num_partitions_total | num_partitions_complete | num_trivial_partitions_complete | #googlecloudcertifiedprogress 标签 | rows_processed | start_timestamp | last_update_timestamp |
---|---|---|---|---|---|---|---|---|
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 | 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 | 27 | 15 | 3 | 50.00% | 2398654 | 2024-01-21 15:56:30.498744-08:00 | 2024-01-22 15:56:39.049799-08:00 |
UPDATE Singers SET LastName = NULL WHERE LastName = '' | 0028284f-0190-52f9-b396-aa588e034806 | 8 | 4 | 4 | 00.00% | 0 | 2024-01-22 15:55:18.498744-08:00 | 2024-01-22 15:56:28.049799-08:00 |
取消费用高昂的查询
我们发现一个分区 DML 已运行数天,但未取得任何进展。因此,我们可以运行以下 gcloud spanner databases sessions
delete
命令来删除使用会话 ID 的会话,进而取消分区 DML。
gcloud spanner databases sessions delete\
5bd37a99-200c-5d2e-9021-15d0dbbd97e6 \
--database=singer_db --instance=test-instance