活跃分区 DML 统计信息

主动分区数据操纵语言 (DML) 提供数据库中当前活跃的分区 DML 的实时进度。

Spanner 提供了一个内置表 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS,其中列出了正在运行的分区 DML 以及它们的进度。

在本文中,我们将详细介绍该表,显示一些使用此表的示例查询,最后演示如何使用这些查询来帮助缓解由活跃分区 DML 导致的问题。

可用情况

SPANNER_SYS 数据只能通过 SQL 接口获取,例如:

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

ACTIVE_PARTITIONED_DMLS

SPANNER_SYS.ACTIVE_PARTITIONED_DMLS 会返回活跃分区 DML 的列表(按其开始时间排序)。

表架构

下面显示了 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS 的表架构。

列名 类型 说明
TEXT STRING 分区 DML 查询语句文本。
TEXT_FINGERPRINT INT64 Fingerprint 是分区 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 CLIGoogle Cloud 控制台运行以下示例 SQL 语句。

列出最早运行的查询

以下查询会返回一个正在运行的分区 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;
PLAIN_TAXT; session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete #googlecloudcertifiedprogress 标签 rows_processed start_timestamp last_update_timestamp
更新音乐会设置场馆 ID = \"amazing venue\" WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50.00% 2398654 2024 年 1 月 21 日 15:56:30.498744-08:00 2024 年 1 月 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 年 1 月 22 日 15:55:18.498744-08:00 2024 年 1 月 22 日 15:56:28.049799-08:00
从 Singers WHERE SingerId > 1000000 中删除 0071a85e-7e5c-576b-8a17-f9bc3d157eea 8 4 3 20.00% 238654 2024 年 1 月 22 日 15:56:30.498744-08:00 2024 年 1 月 22 日 15:56:19.049799-08:00
UPDATE Singers SET MarketingBudget = 1000 WHERE true 036097a9-91d4-566a-a399-20c754eabdc2 8 5 0 62.5% 238654 2024 年 1 月 22 日 15:57:47.498744-08:00 2024 年 1 月 22 日 15:57:39.049799-08:00

限制

使用 SPANNER_SYS.ACTIVE_PARTITIONED_DMLS 表存在以下限制:

  • PROGRESSROWS_PROCESSEDLAST_UPDATE_TIMESTAMP 结果会在完成分区边界时递增,因此分区 DML 可能会继续更新行,而这三个字段中的值保持不变。

  • 如果分区 DML 中有数百万个分区,则 PROGRESS 列中的值可能不会捕获所有增量进度。使用 NUM_PARTITIONS_COMPLETENUM_TRIVIAL_PARTITIONS_COMPLETE 可引用更精细的粒度进度。

  • 如果使用 RPC 请求取消分区 DML,则已取消的分区 DML 可能仍会显示在表中。如果使用会话删除功能取消分区 DML,系统会立即将其从表中移除。 如需了解详情,请参阅删除会话 ID

使用活跃分区 DML 查询数据排查高 CPU 利用率问题

查询统计信息事务统计信息在排查 Spanner 数据库的延迟问题时提供有用的信息。这些工具会提供有关已完成查询的信息。然而,有时有必要知道系统中正在运行什么。例如,请考虑 CPU 利用率较高且您希望回答以下问题的场景。

  • 目前正在运行多少个分区 DML?
  • 这些分区 DML 是什么?
  • 其中多少个分区 DML 长时间运行?
  • 哪个会话正在运行查询?

如果您对上述问题有了解答,则可以决定采取以下措施。

  • 删除执行查询的会话可立即解决问题。
  • 降低分区 DML 的频率。

在下面的演示中,我们将检查活跃的分区 DML 并确定要执行的操作(如果有)。

检索活跃分区 DML 的摘要

在示例场景中,我们发现 CPU 使用率高于正常 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;
PLAIN_TAXT; session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete #googlecloudcertifiedprogress 标签 rows_processed start_timestamp last_update_timestamp
更新音乐会设置场馆 ID = \"amazing venue\" WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50.00% 2398654 2024 年 1 月 21 日 15:56:30.498744-08:00 2024 年 1 月 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 年 1 月 22 日 15:55:18.498744-08:00 2024 年 1 月 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

后续步骤