Spanner には、次の組み込みテーブルが用意されています。
- SPANNER_SYS.TABLE_SIZES_STATS_1HOUR: データベース内のテーブルとインデックスのサイズが格納されます。
- SPANNER_SYS.TABLE_SIZES_STATS_PER_LOCALITY_GROUP_1HOUR: ローカリティ グループごとに、データベース内のテーブルとインデックスのサイズが格納されます。
テーブルサイズはバイト単位です。テーブルサイズにはデータ バージョンが含まれます。これらの組み込みテーブルを使用して、テーブルとインデックスのサイズの経時的な変化をモニタリングできます。インデックスの作成と削除、インデックスの変更(インデックスに行を挿入するときや、新しい列を追加するとき)を行うときにも、インデックスのサイズをモニタリングできます。さらに、変更ストリーム テーブルのサイズも確認できます。
データベース ストレージは、データベース ストレージ指標の合計でモニタリングできます。SPANNER_SYS.TABLE_SIZES_STATS_1HOUR と SPANNER_SYS.TABLE_SIZES_STATS_PER_LOCALITY_GROUP_1HOUR を使用して、データベース ストレージの内訳を確認できます。
テーブルサイズの統計情報にアクセスする
Spanner は、SPANNER_SYS スキーマにテーブルサイズの統計情報を提供します。SPANNER_SYS データにアクセスするには、次の方法を使用できます。
- Google Cloud コンソール(データベースの Spanner Studio ページ) 
- gcloud spanner databases execute-sqlコマンド。
- executeSqlメソッドまたは- executeStreamingSqlメソッド。
Spanner が提供する次の単一読み取りメソッドは、SPANNER_SYS をサポートしていません。
- 強力な読み取りを実行してテーブルから単一行または複数行を読み取る。
- ステイル読み取りを実行してテーブルから単一行または複数行を読み取る。
- セカンダリ インデックスから単一行または複数行を読み取る。
TABLE_SIZES_STATS_1HOUR
SPANNER_SYS.TABLE_SIZES_STATS_1HOUR には、データベース内のすべてのテーブルのサイズが interval_end で並べ替えられて格納されます。間隔は時計の時刻に基づいており、正時に終了します。内部的には、5 分ごとに Spanner がすべてのサーバーからデータを収集し、その後すぐに TABLE_SIZES_STATS_1HOUR テーブルでデータを利用できるようにします。その後、データは 1 時間ごとに平均化されます。たとえば、午前 11 時 59 分 30 秒の場合、TABLE_SIZES_STATS_1HOUR には午前 10 時 00 分 00 秒から午前 10 時 59 分 59 秒までの平均テーブルサイズが表示されます。
テーブル スキーマ
| 列名 | 型 | 説明 | 
|---|---|---|
| INTERVAL_END | TIMESTAMP | テーブルサイズの収集間隔の終了時刻。 | 
| TABLE_NAME | STRING | テーブルまたはインデックスの名前。 | 
| USED_BYTES | FLOAT64 | テーブルサイズ(バイト単位)。 | 
| USED_SSD_BYTES | FLOAT64 | テーブルで使用される SSD ストレージ(バイト単位)。 | 
| USED_HDD_BYTES | FLOAT64 | テーブルで使用される HDD ストレージ(バイト単位)。 | 
クエリの例
このセクションでは、テーブルサイズの統計情報の集計を取得する SQL ステートメントの例をいくつか紹介します。これらの SQL ステートメントは、クライアント ライブラリ、gcloud spanner、または Google Cloud コンソールを使用して実行できます。
最新の間隔で上位 4 つのテーブルとインデックスをクエリする
次のクエリは、最新の間隔で上位 4 つのテーブルとインデックスを返します。
    SELECT interval_end,
          table_name,
          used_bytes
    FROM spanner_sys.table_sizes_stats_1hour
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_sizes_stats_1hour)
    ORDER BY used_bytes DESC
    LIMIT 4;
  クエリ出力
| interval_end | table_name | used_bytes | 
|---|---|---|
| 2022-11-15 13:00:00-07:00 | order_item | 60495552 | 
| 2022-11-15 13:00:00-07:00 | orders | 13350000 | 
| 2022-11-15 13:00:00-07:00 | item_inventory | 2094549 | 
| 2022-11-15 13:00:00-07:00 | customer | 870000 | 
過去 24 時間の特定のテーブルまたはインデックスのクエリサイズの傾向
次のクエリは、過去 24 時間のテーブルのサイズを返します。
GoogleSQL
SELECT interval_end, used_bytes FROM spanner_sys.table_sizes_stats_1hour WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -24 HOUR) AND table_name = "table_name" ORDER BY interval_end DESC;
ここで
- table_nameは、データベース内の既存のテーブルまたはインデックスである必要があります。
PostgreSQL
SELECT interval_end, used_bytes FROM spanner_sys.table_sizes_stats_1hour WHERE interval_end > spanner.timestamptz_subtract(now(), '24 HOUR') AND table_name = 'table_name' ORDER BY interval_end DESC;
ここで
- table_nameは、データベース内の既存のテーブルまたはインデックスである必要があります。
クエリ出力
| interval_end | used_bytes | 
|---|---|
| 2022-11-15 13:00:00-07:00 | 13350000 | 
| 2022-11-15 12:00:00-07:00 | 13350000 | 
| 2022-11-15 11:00:00-07:00 | 13350000 | 
| 2022-11-15 10:00:00-07:00 | 13350000 | 
| 2022-11-15 09:00:00-07:00 | 13350000 | 
| 2022-11-15 08:00:00-07:00 | 12350000 | 
| 2022-11-15 07:00:00-07:00 | 12350000 | 
| 2022-11-15 06:00:00-07:00 | 12350000 | 
| 2022-11-15 05:00:00-07:00 | 11350000 | 
| 2022-11-15 04:00:00-07:00 | 11350000 | 
| 2022-11-15 03:00:00-07:00 | 11350000 | 
| 2022-11-15 02:00:00-07:00 | 11350000 | 
| 2022-11-15 01:00:00-07:00 | 11350000 | 
| 2022-11-15 00:00:00-07:00 | 10350000 | 
| 2022-11-14 23:00:00-07:00 | 10350000 | 
| 2022-11-14 22:00:00-07:00 | 10350000 | 
| 2022-11-14 21:00:00-07:00 | 10350000 | 
| 2022-11-14 20:00:00-07:00 | 10350000 | 
| 2022-11-14 19:00:00-07:00 | 10350000 | 
| 2022-11-14 18:00:00-07:00 | 10350000 | 
| 2022-11-14 17:00:00-07:00 | 10350000 | 
| 2022-11-14 16:00:00-07:00 | 10350000 | 
| 2022-11-14 15:00:00-07:00 | 10350000 | 
| 2022-11-14 14:00:00-07:00 | 10350000 | 
| 2022-11-14 13:00:00-07:00 | 10350000 | 
TABLE_SIZES_STATS_PER_LOCALITY_GROUP_1HOUR
SPANNER_SYS.TABLE_SIZES_STATS_PER_LOCALITY_GROUP_1HOUR には、ローカリティ グループごとに、interval_end で並べ替えられたデータベース内のすべてのテーブルのサイズが格納されます。間隔は時計の時刻に基づいており、正時に終了します。内部的には、5 分ごとに Spanner がすべてのサーバーからデータを収集し、その後すぐに TABLE_SIZES_STATS_PER_LOCALITY_GROUP_1HOUR テーブルでデータを利用できるようにします。その後、データは 1 時間ごとに平均化されます。たとえば、午前 11 時 59 分 30 秒に、TABLE_SIZES_STATS_PER_LOCALITY_GROUP_1HOUR で午前 10 時 00 分 00 秒から午前 10 時 59 分 59 秒までの各ローカリティ グループの平均テーブルサイズが示されます。
テーブル スキーマ
| 列名 | 型 | 説明 | 
|---|---|---|
| INTERVAL_END | TIMESTAMP | テーブルサイズの収集間隔の終了時刻。 | 
| TABLE_NAME | STRING | テーブルまたはインデックスの名前。 | 
| LOCALITY_GROUP | STRING | ローカリティ グループの名前。 | 
| USED_BYTES | FLOAT64 | テーブルサイズ(バイト単位)。 | 
| USED_SSD_BYTES | FLOAT64 | テーブルで使用される SSD ストレージ(バイト単位)。 | 
| USED_HDD_BYTES | FLOAT64 | テーブルで使用される HDD ストレージ(バイト単位)。 | 
データの保持
Spanner は、少なくとも過去 30 日間の間隔で SPANNER_SYS.TABLE_SIZES_STATS_1HOUR のデータを保持します。
次のステップ
- 別のイントロスペクション ツールについて学習する。
- Spanner が各データベースについて、データベースの情報スキーマ テーブルに保存するその他の情報について学習する。
- Spanner に関する SQL のベスト プラクティスについて学習する。
- 高 CPU 使用率の調査について学習する。