Spanner には、テーブル列の読み取り、クエリ、書き込みオペレーションの統計情報を記録する組み込みテーブルが用意されています。列オペレーションの統計情報を使用すると、次のことを行えます。
予期しない読み取り、クエリ、書き込みトラフィックがある列を特定する。
使用頻度の高い列を特定する。
列に対してクエリを実行、またはクエリの書き込みを行うと、アクセスした行数に関係なく、その列に対するオペレーション数が 1 ずつ増加します。
データベース全体をモニタリングするには、システム分析情報のグラフで 1 秒あたりのオペレーション数、API メソッドごとの 1 秒あたりのオペレーション数、その他の関連指標を測定する指標を使用します。
列オペレーションの統計情報にアクセスする
Spanner は、SPANNER_SYS
スキーマに列オペレーションの統計情報を提供します。SPANNER_SYS
データにアクセスするには、次の手段を使用します。
Google Cloud コンソール(データベースの Spanner Studio ページ)
executeSql
メソッドまたはexecuteStreamingSql
メソッド。
Spanner が提供する次の単一読み取りメソッドは、SPANNER_SYS
をサポートしていません。
- 強力な読み取りを実行してテーブルから単一行または複数行を読み取る。
- ステイル読み取りを実行してテーブルから単一行または複数行を読み取る。
- セカンダリ インデックスから単一行または複数行を読み取る。
詳細については、単一読み取りメソッドをご覧ください。
列オペレーションの統計情報
次のテーブルでは、特定の期間中の列の読み取り、クエリ、書き込みの統計情報が追跡されます。
SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE
: 1 分間隔のオペレーションSPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE
: 10 分間隔のオペレーションSPANNER_SYS.COLUMN_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 |
テーブルまたはインデックスの名前。 |
COLUMN_NAME |
STRING |
列の名前。 |
READ_COUNT |
INT64 |
列からの読み取り回数。 |
QUERY_COUNT |
INT64 |
列から読み取るクエリの数。 |
WRITE_COUNT |
INT64 |
テーブルに書き込むクエリの数。 |
IS_QUERY_CACHE_MEMORY_CAPPED |
BOOL |
メモリ不足が原因で統計情報の収集が制限されたかどうか。 |
ミューテーションを使用してデータベースにデータを挿入すると、Spanner は、挿入ステートメントがアクセスするテーブルごとに WRITE_COUNT
を 1 ずつインクリメントします。また、基になるテーブルをスキャンせずにインデックスにアクセスするクエリでは、インデックスの QUERY_COUNT
のみが増加します。
データの保持
Spanner は最低でも、次の期間中に各テーブルのデータを保持します。
SPANNER_SYS.COLUMN_OPERATIONS_STATS_MINUTE
: 過去 6 時間を対象とする間隔。SPANNER_SYS.COLUMN_OPERATIONS_STATS_10MINUTE
: 過去 4 日間を対象とする間隔。SPANNER_SYS.COLUMN_OPERATIONS_STATS_HOUR
: 過去 30 日間を対象とする間隔。
クエリの例
このセクションには、列操作の統計情報の集計を取得する SQL ステートメントの例が複数含まれています。これらの SQL ステートメントは、クライアント ライブラリまたは Google Cloud CLI を使用して実行できます。
最新の間隔で書き込みオペレーションが最も多いテーブル列に対してクエリを実行する
GoogleSQL
SELECT interval_end, table_name, column_name, write_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY write_count DESC;
PostgreSQL
SELECT interval_end, table_name, column_name, write_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY write_count DESC;
最新の間隔でクエリ オペレーションが最も多い列に対してクエリを実行する
GoogleSQL
SELECT interval_end, table_name, column_name, query_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY query_count DESC;
PostgreSQL
SELECT interval_end, table_name, column_name, query_count FROM spanner_sys.column_operations_stats_minute WHERE interval_end = ( SELECT MAX(interval_end) FROM spanner_sys.column_operations_stats_minute) ORDER BY query_count DESC;
過去 6 時間における列の使用状況に対してクエリを実行する
GoogleSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_minute WHERE table_name = "table_name" AND column_name = "column_name" ORDER BY interval_end DESC;
ここで
table_name
は、データベース内の既存のテーブルまたはインデックスである必要があります。column_name
はテーブル内の既存の列である必要があります。
PostgreSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_minute WHERE table_name = 'table_name' AND column_name = 'column_name' ORDER BY interval_end DESC;
ここで
table_name
は、データベース内の既存のテーブルまたはインデックスである必要があります。column_name
はテーブル内の既存の列である必要があります。
過去 14 日間における列の使用状況に対してクエリを実行する
GoogleSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_hour WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY) AND table_name = "table_name" AND column_name = "column_name" ORDER BY interval_end DESC;
次のように置き換えます。
table_name
: データベース内のテーブル名またはインデックス名。column_name
: テーブル内の列名。
PostgreSQL
SELECT interval_end, read_count, query_count, write_count FROM spanner_sys.column_operations_stats_hour WHERE interval_end > spanner.timestamptz_subtract(now(), '14 DAY') AND table_name = 'table_name' AND column_name = 'column_name' ORDER BY interval_end DESC;
次のように置き換えます。
table_name
: データベース内のテーブル名またはインデックス名。column_name
: テーブル内の列名。
次のステップ
他の組み込み統計テーブルについて学習する。
Spanner に関する SQL のベスト プラクティスについて学習する。