BigQuery テーブルのメタデータ インデックス作成

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

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

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

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

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

  1. Google 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: 実際の Google Cloud プロジェクト 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. Google Cloud コンソールで、[容量管理] ページに移動します。

    [容量管理] に移動

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

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

  4. [Job Type] を [Background] に設定します。

  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. Google 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. [Integrations] ページに移動します。

    [Integrations] に移動

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

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

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

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

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

未更新アラート

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

このアラートを構成する手順は次のとおりです。

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

    [Integrations] に移動

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

  4. [アラート] タブで、[列メタデータ インデックスの未更新期間 - 増加率が過大] を選択します。

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

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

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

制限事項

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

次のステップ