アクティブなパーティション化データ操作言語(DML)は、データベースでアクティブなパーティション化 DML の進行状況をリアルタイムで提供します。
Spanner には、実行中のパーティション化 DML とその進行状況を一覧表示する組み込みテーブル SPANNER_SYS.ACTIVE_PARTITIONED_DMLS
が用意されています。
このページでは、このテーブルについて詳しく説明し、このテーブルを使用するクエリの例を紹介します。最後に、これらのクエリを使用して、アクティブなパーティション化 DML により問題を軽減する方法を紹介します。このページの情報は、GoogleSQL 言語データベースと PostgreSQL 言語データベースに適用されます。
アクティブなパーティション化 DML の統計情報にアクセスする
Spanner は、SPANNER_SYS
スキーマにアクティブなパーティション化 DML の統計情報を提供します。SPANNER_SYS
データにアクセスするには、次の方法を使用できます。
Google Cloud コンソールのデータベースの Spanner Studio ページ
executeSql
メソッドまたはexecuteStreamingSql
メソッド。
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 | progress | 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 は、これらの 3 つのフィールドの値が同じままで行を更新し続けることができます。パーティション 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 |
実行中のパーティション化 DML の上位 2 つの一覧表示
次に、クエリを実行して、パーティション化 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 | progress | 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
次のステップ
- 別のイントロスペクション ツールについて学習する。
- Spanner が各データベースについて、データベースの情報スキーマ テーブルに保存するその他の情報について学習する。
- Spanner に関する SQL のベスト プラクティスについて学習する。