BigQuery テーブルのメタデータ インデックス処理

このドキュメントでは、BigQuery の列メタデータ インデックス処理について説明し、インデックスの鮮度とクエリのパフォーマンスを向上させるために専用リソースを割り当てる方法について説明します。

BigQuery は、1 GiB を超える BigQuery テーブルのメタデータを自動的にインデックス処理します。このメタデータには、ファイルの場所、パーティショニング情報、列レベルの属性が含まれます。BigQuery は、このメタデータを使用してクエリを最適化し、高速化します。

デフォルトでは、BigQuery のメタデータ インデックス処理は無料のバックグラウンド オペレーションであり、ユーザーによる操作は必要ありません。ただし、インデックスの鮮度は利用可能な無料のリソースに依存し、パフォーマンスのサービスレベル目標(SLO)はありません。インデックスの鮮度がユースケースで重要な場合は、BACKGROUND 予約を構成することをおすすめします。

メタデータ インデックスの更新時間を表示する

テーブルのメタデータ インデックスの最終更新時間を表示するには、INFORMATION_SCHEMA.TABLE_STORAGE ビューLAST_METADATA_INDEX_REFRESH_TIME 列に対してクエリを実行します。手順は次のとおりです。

  1. Trusted Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    SELECT
      project_id,
      project_number,
      table_name,
      last_metadata_index_refresh_time
    FROM
      [PROJECT_ID.]region-REGION.INFORMATION_SCHEMA.TABLE_STORAGE;

    次のように置き換えます。

    • PROJECT_ID: 実際の Trusted Cloud by S3NS プロジェクト ID。指定しない場合は、デフォルトのプロジェクトが使用されます。
    • REGION: プロジェクトが配置されているリージョン(例: region-us)。
  3. [実行] をクリックします。

列メタデータ インデックスの使用状況を表示する

ジョブの完了後に列メタデータ インデックスが使用されたかどうかを表示するには、Job リソースの TableMetadataCacheUsage プロパティを確認します。unusedReason フィールドが空(入力されていない)の場合、列メタデータ インデックスが使用されました。このフィールドに入力がある場合、関連する explanation フィールドには、列メタデータ インデックスが使用されなかった理由が示されます。

列メタデータ インデックスの使用状況は、INFORMATION_SCHEMA.JOBS ビューmetadata_cache_statistics フィールドでも確認できます。

たとえば、次の例では、my-job ジョブの列メタデータ インデックスの使用状況が表示されます。

SELECT metadata_cache_statistics
FROM `region-US`.INFORMATION_SCHEMA.JOBS
WHERE job_id = 'my-job';

別の例として、次の例では、my-table テーブルの列メタデータ インデックスを使用したジョブの数が表示されます。

SELECT COUNT(*)
FROM
  `region-US`.INFORMATION_SCHEMA.JOBS,
  UNNEST(metadata_cache_statistics.table_metadata_cache_usage) AS stats
WHERE
  stats.table_reference.table_id='my-table' AND
  stats.table_reference.dataset_id='my-dataset' AND
  stats.table_reference.project_id='my-project' AND
  stats.unusedReason IS NULL;

専用のインデックス処理リソースを設定する

プロジェクトでメタデータ インデックスの更新用にリソースを設定するには、まずプロジェクトに予約が割り当てられている必要があります。手順は次のとおりです。

  1. BACKGROND 予約を作成する
  2. プロジェクトを予約に割り当てる

予約を設定したら、次のいずれかの方法でメタデータ インデックスの処理を行うジョブにスロットを割り当てます。デフォルトでは、この方法で割り当てたスロットは、アイドル状態の場合に他のジョブと共有されます。詳細については、アイドル スロットをご覧ください。

コンソール

  1. Trusted Cloud コンソールで、[容量管理] ページに移動します。

    容量管理に移動

  2. [予約のアクション] > [割り当ての作成] をクリックします。

  3. 予約プロジェクトを選択します。

  4. [ジョブタイプ] を [バックグラウンド] に設定します。

  5. [作成] をクリックします。

bq

bq mk コマンドを使用します。

bq mk \
  --project_id=ADMIN_PROJECT_ID \
  --location=LOCATION \
  --reservation_assignment \
  --reservation_id=RESERVATION_NAME \
  --assignee_id=PROJECT_ID \
  --job_type=BACKGROUND \
  --assignee_type=PROJECT

次のように置き換えます。

  • ADMIN_PROJECT_ID: 予約リソースを所有する管理プロジェクトのプロジェクト ID。
  • LOCATION: 予約のロケーション
  • RESERVATION_NAME: 予約の名前。
  • PROJECT_ID: この予約に割り当てるプロジェクト ID。

SQL

予約をプロジェクトに割り当てるには、CREATE ASSIGNMENT DDL ステートメントを使用します。

  1. Trusted Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE ASSIGNMENT
    ADMIN_PROJECT_ID.region-LOCATION.RESERVATION_NAME.ASSIGNMENT_ID
    OPTIONS (
      assignee = 'projects/PROJECT_ID',
      job_type = 'BACKGROUND');
    次のように置き換えます。

    • ADMIN_PROJECT_ID: 予約リソースを所有する管理プロジェクトのプロジェクト ID。
    • LOCATION: 予約のロケーション
    • RESERVATION_NAME: 予約の名前。
    • ASSIGNMENT_ID: 割り当ての ID。ID はプロジェクトとロケーションごとに一意でなければならず、先頭と末尾を英小文字または数字にする必要があり、英小文字、数字、ダッシュのみを使用できます。
    • PROJECT_ID: テーブルを含むプロジェクトの ID。このプロジェクトは予約に割り当てられます。
  3. [実行] をクリックします。

インデックス ジョブの情報を表示する

専用のインデックス ジョブを設定すると、JOBS ビューでインデックス ジョブに関する情報を確認できます。次の SQL サンプルは、PROJECT_NAME の最新の更新ジョブ 5 件を示しています。

SELECT *
FROM
  region-us.INFORMATION_SCHEMA.JOBS
WHERE
  project_id = 'PROJECT_NAME'
  AND SEARCH(job_id, '`metadata_cache_refresh`')
ORDER BY
  creation_time DESC
LIMIT 5;

PROJECT_NAME は、メタデータ インデックス ジョブを含むプロジェクトの名前に置き換えます。

メタデータ インデックス処理のアラートを構成する

Cloud Monitoring のアラート プロセスは、BigQuery のパフォーマンスが定義された基準を満たしていない場合に通知します。詳細については、アラートの概要をご覧ください。メタデータ インデックス処理を使用すると、スロットの使用率と古さに関するアラートを構成できます。

スロット使用量に関するアラート

このアラートは、バックグラウンド予約が定義された割り当ての割合を超えた場合に通知します。デフォルト値は 95% です。このアラートは、特定のリソース予約に対して、またはすべてのバックグラウンド リソース予約に対して構成できます。このアラートがトリガーされた場合は、予約サイズを増やすことをおすすめします。

バックグラウンド予約ごとにこのアラートを構成するには、次の操作を行います。

  1. モニタリング通知チャンネルをまだ設定していない場合は、設定します。
  2. [インテグレーション] ページに移動します。

    [インテグレーション] に移動

  3. BigQuery インテグレーションを見つけて、[詳細を表示] をクリックします。

  4. [アラート] タブで、[スロット使用率 - バックグラウンド メタデータ キャッシュ スロット使用率が高すぎる] を選択します。

  5. 省略可: このアラートをさらにカスタマイズするには、[オプションを表示 > アラート ポリシーをカスタマイズ] をクリックします。

  6. [通知の構成] で通知チャネルを選択します。

  7. [作成] をクリックします。

鮮度低下アラート

このアラートは、列メタデータ インデックスの平均鮮度が既存の平均と比較して大幅に低下した場合に通知します。デフォルトのしきい値は、4 時間の平均が 30 分以上、以前の平均の 2 倍を超えた場合です。このアラートがトリガーされた場合は、予約サイズを増やすか、バックグラウンド予約がない場合は作成することをおすすめします。

このアラートを構成するには、次の操作を行います。

  1. モニタリング通知チャンネルをまだ設定していない場合は、設定します。
  2. [インテグレーション] ページに移動します。

    [インテグレーション] に移動

  3. BigQuery インテグレーションを見つけて、[詳細を表示] をクリックします。

  4. [アラート] タブで、[列メタデータ インデックスが古い - 割合増加が高すぎる] を選択します。

  5. 省略可: このアラートをさらにカスタマイズするには、[オプションを表示 > アラート ポリシーをカスタマイズ] をクリックします。

  6. [通知の構成] で通知チャネルを選択します。

  7. [作成] をクリックします。

制限事項

メタデータ クエリのパフォーマンスの強化は、SELECTINSERTCREATE TABLE AS SELECT ステートメントにのみ適用されます。データ操作言語(DML)ステートメントでは、メタデータ インデックス処理による改善は見られません。

次のステップ