列オペレーションの統計情報

Spanner には、テーブル列の読み取り、クエリ、書き込みオペレーションの統計情報を記録する組み込みテーブルが用意されています。列オペレーションの統計情報を使用すると、次のことを行えます。

  • 予期しない読み取り、クエリ、書き込みトラフィックがある列を特定する。

  • 使用頻度の高い列を特定する。

列に対してクエリを実行、またはクエリの書き込みを行うと、アクセスした行数に関係なく、その列に対するオペレーション数が 1 ずつ増加します。

データベース全体をモニタリングするには、システム分析情報のグラフで 1 秒あたりのオペレーション数、API メソッドごとの 1 秒あたりのオペレーション数、その他の関連指標を測定する指標を使用します。

列オペレーションの統計情報にアクセスする

Spanner は、SPANNER_SYS スキーマに列オペレーションの統計情報を提供します。SPANNER_SYS データにアクセスするには、次の手段を使用します。

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: テーブル内の列名。

次のステップ