Spanner には、テーブル(変更ストリーム テーブルを含む)とインデックスの読み取り(またはクエリ)、書き込み、削除オペレーションの統計情報を記録する組み込みテーブルが用意されています。テーブル オペレーションの統計情報を使用すると、次のことができます。
ストレージの増加に対応する書き込みトラフィックが増加しているテーブルを特定します。
予期しない読み取り、書き込み、削除のトラフィックがあるテーブルを特定します。
使用頻度の高いテーブルを特定します。
テーブルをクエリまたは書き込みすると、アクセスされた行数に関係なく、テーブルに対応するオペレーション数が 1 増加します。
データベース全体の 1 秒あたりのオペレーションの指標は、システム分析情報グラフの 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 |
テーブルで削除を実行するクエリの数。 |
ミューテーションを使用してデータベースにデータを挿入すると、insert ステートメントによってアクセスされるテーブルごとに 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 ステートメントの例がいくつか含まれています。これらの SQL ステートメントは、クライアント ライブラリまたは gcloud Spanner を使用して実行できます。
最新の間隔での最新の書き込みオペレーションを使用して、テーブルとインデックスをクエリする
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));
次のステップ
テーブルとインデックスのサイズを決定するには、テーブルサイズの統計情報を使用します。
別のイントロスペクション ツールについて学習します。
Spanner に関する SQL のベスト プラクティスについて学習します。