テーブル オペレーションの統計情報

Spanner には、テーブル(変更ストリーム テーブルを含む)とインデックスの読み取り(またはクエリ)、書き込み、削除オペレーションの統計情報を記録する組み込みテーブルが用意されています。テーブル オペレーションの統計情報を使用すると、次のことができます。

  • ストレージの増加に対応する書き込みトラフィックが増加しているテーブルを特定します。

  • 予期しない読み取り、書き込み、削除のトラフィックがあるテーブルを特定します。

  • 使用頻度の高いテーブルを特定します。

テーブルをクエリまたは書き込みすると、アクセスされた行数に関係なく、テーブルに対応するオペレーション数が 1 増加します。

データベース全体の 1 秒あたりのオペレーションの指標は、システム分析情報グラフの Operations per secondOperations per second by API method などの関連指標でモニタリングできます。

対象

Spanner は、SPANNER_SYS スキーマのテーブル オペレーション統計を提供します。SPANNER_SYS データは SQL インターフェースを介してのみ使用できます。例:

  • Google Cloud コンソールのデータベースの Spanner Studio ページ

  • gcloud spanner databases execute-sql コマンド

  • executeQueryAPI

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));

次のステップ