アクティブなパーティション化 DML の統計情報

アクティブなパーティション分割データ操作言語(DML)は、データベースで現在アクティブなパーティション化 DML の進捗状況をリアルタイムで提供します。

Spanner には、実行中のパーティション化 DML とその進行状況を一覧表示する組み込みテーブル SPANNER_SYS.ACTIVE_PARTITIONED_DMLS が用意されています。

この記事では、このテーブルについて詳しく説明し、このテーブルを使用するクエリの例を紹介します。最後に、これらのクエリを使用して、アクティブなパーティション化 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 フィンガープリントは、パーティション化された 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 が進行した最後のタイムスタンプ。パーティションの完了後に更新されます。

クエリの例

次の SQL ステートメントの例は、クライアント ライブラリGoogle Cloud CLI、または Google Cloud コンソールを使用して実行できます。

最も古い実行中クエリの一覧表示

次のクエリは、クエリの開始時間で並べ替えて、実行中のパーティション化 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 ツイートしましょう 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 テーブルを使用する場合の制限事項は次のとおりです。

  • PROGRESSROWS_PROCESSEDLAST_UPDATE_TIMESTAMP の結果は、完了したパーティションの境界で増分されます。そのため、パーティション化 DML は行の更新を続ける可能性がありますが、これらの 3 つのフィールドの値は変わりません。

  • パーティション化 DML に数百万のパーティションがある場合、PROGRESS 列の値は、すべての増分進捗状況をキャプチャしない場合があります。NUM_PARTITIONS_COMPLETENUM_TRIVIAL_PARTITIONS_COMPLETE を使用して、より細かい粒度の進行状況を参照します。

  • RPC リクエストを使用してパーティション 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 の一覧表示

その後、クエリを実行して、パーティション化 DML の開始時刻で並べ替えられた、上位 2 つの最も古い実行中パーティション化 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 ツイートしましょう 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

次のステップ