パーティションとクラスタの推奨事項を管理する

このドキュメントでは、パーティションとクラスタの Recommender の仕組みと、推奨事項と分析情報の表示方法、パーティションとクラスタの推奨事項を適用する方法について説明します。

Recommender の仕組み

BigQuery のパーティショニングとクラスタリングの Recommender は、BigQuery テーブルを最適化するためのパーティションまたはクラスタの推奨事項を生成します。Recommender は、BigQuery テーブルのワークフローを分析し、テーブル パーティショニングまたはテーブル クラスタリングのいずれかを使用してワークフローとクエリの費用を最適化するための推奨事項を提供します。

Recommender サービスの詳細については、Recommender の概要をご覧ください。

パーティショニングとクラスタリングの Recommender は過去 30 日間のプロジェクトのワークロード実行データを使用して、最適ではないパーティショニングとクラスタリングの構成について BigQuery テーブルを分析します。また、Recommender は ML を使用して、異なるパーティショニングまたはクラスタリングの構成でワークロードの実行がどの程度最適化されるかを予測します。Recommender は、テーブルのパーティショニングまたはクラスタリングによって大幅な費用削減が見込めると判断した場合、推奨事項を生成します。パーティショニングとクラスタリングの Recommender では、次のタイプの推奨事項が生成されます。

既存のテーブルタイプ 推奨事項サブタイプ 推奨事項の例
パーティション分割なし、クラスタ化なし パーティション 「column_C を DAY でパーティショニングすることで、毎月約 64 スロット時間を削減する」
パーティション分割なし、クラスタ化なし クラスタ 「column_C でクラスタリングすることで、毎月約 64 スロット時間を削減する」
パーティション分割、クラスタ化なし クラスタ 「column_C でクラスタリングすることで、毎月約 64 スロット時間を削減する」

それぞれの推奨事項は、次の 3 つの部分で構成されています。

  • 特定のテーブルをパーティショニングまたはクラスタリングを行うためのガイダンス
  • パーティショニングまたはクラスタリングを行うテーブル内の特定の列
  • 推奨事項の適用による毎月の推定削減額

Recommender は、潜在的なワークロード削減額を計算するために、過去 30 日間の実行ワークロード データが将来のワークロードを表すことを前提としています。

また、Recommender API は、テーブル ワークロード情報を分析情報の形式で返します。分析情報は、プロジェクトのワークロードの理解に役立つ検出結果であり、パーティションまたはクラスタの推奨事項によってワークロードの費用がどのように改善されるかに関するより多くのコンテキストを提供します。

制限事項

  • パーティショニングとクラスタリングの Recommender は、レガシー SQL を使用した BigQuery テーブルをサポートしていません。Recommender は、推奨事項を生成するときに、分析でレガシー SQL クエリを除外します。また、レガシー SQL を使用して BigQuery テーブルにパーティションの推奨事項を適用すると、そのテーブル内のレガシー SQL ワークフローがすべて機能しなくなります。

    パーティションの推奨事項を適用する前に、レガシー SQL ワークフローを GoogleSQL に移行してください。

  • BigQuery では、テーブルのパーティショニング スキームの変更はサポートされていません。テーブルのパーティショニングを変更できるのは、テーブルのコピーに対してのみです。詳細については、パーティションの推奨事項を適用するをご覧ください。

ロケーション

パーティショニングとクラスタリングの Recommender は、次の処理ロケーションで使用できます。

リージョンの説明 リージョン名 詳細
アジア太平洋
デリー asia-south2
香港 asia-east2
ジャカルタ asia-southeast2
ムンバイ asia-south1
大阪 asia-northeast2
ソウル asia-northeast3
シンガポール asia-southeast1
シドニー australia-southeast1
台湾 asia-east1
東京 asia-northeast1
ヨーロッパ
ベルギー europe-west1 リーフアイコン 低 CO2
ベルリン europe-west10 リーフアイコン 低 CO2
EU(マルチリージョン) eu
フランクフルト europe-west3 リーフアイコン 低 CO2
ロンドン europe-west2 リーフアイコン 低 CO2
オランダ europe-west4 リーフアイコン 低 CO2
チューリッヒ europe-west6 リーフアイコン 低 CO2
南北アメリカ
アイオワ us-central1 リーフアイコン 低 CO2
ラスベガス us-west4
ロサンゼルス us-west2
モントリオール northamerica-northeast1 リーフアイコン 低 CO2
北バージニア us-east4
オレゴン us-west1 リーフアイコン 低 CO2
ソルトレイクシティ us-west3
サンパウロ southamerica-east1 リーフアイコン 低 CO2
トロント northamerica-northeast2 リーフアイコン 低 CO2
米国(マルチリージョン) us

始める前に

必要な権限

パーティションとクラスタの推奨事項にアクセスするために必要な権限を取得するには、BigQuery パーティショニング クラスタリング Recommender 閲覧者roles/recommender.bigqueryPartitionClusterViewer)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、パーティションとクラスタの推奨事項にアクセスするために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

パーティションとクラスタの推奨事項にアクセスするには、次の権限が必要です。

  • recommender.bigqueryPartitionClusterRecommendations.get
  • recommender.bigqueryPartitionClusterRecommendations.list

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。

推奨事項を表示する

このセクションでは、Google Cloud コンソール、Google Cloud CLI、Recommender API を使用して、パーティションとクラスタの推奨事項と分析情報を表示する方法について説明します。

次のオプションのいずれかを選択します。

コンソール

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

    [BigQuery] に移動

  2. 推奨事項タブを開くには、 [推奨事項] > [すべての推奨事項を表示] をクリックします。

    [推奨事項] をクリックして、すべての推奨事項を表示します。

    [推奨事項] タブには、プロジェクトで利用できるすべての推奨事項が一覧表示されます。

  3. [BigQuery ワークロード費用の最適化] パネルで、[すべて表示] をクリックします。

    費用の推奨事項の表には、現在のプロジェクトに対して生成されたすべての推奨事項が一覧表示されます。たとえば、次のスクリーンショットでは、Recommender が example_table テーブルを分析し、example_column 列をクラスタリングすれば、表示された程度のバイト数とスロット数を節約できると推奨しています。

    パーティショニングとクラスタリングの推奨事項を含む推奨事項の表。

  4. テーブルの分析情報と推奨事項の詳細を表示するには、[推奨事項] をクリックします。

gcloud

特定のプロジェクトのパーティションまたはクラスタの推奨事項を表示するには、gcloud recommender recommendations list コマンドを使用します。

gcloud recommender recommendations list \
    --project=PROJECT_NAME \
    --location=REGION_NAME \
    --recommender=google.bigquery.table.PartitionClusterRecommender \
    --format=FORMAT_TYPE \

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

  • PROJECT_NAME: BigQuery テーブルを含むプロジェクトの名前
  • REGION_NAME: プロジェクトが存在するリージョン
  • FORMAT_TYPE: サポートされている gcloud CLI 出力形式(例えば、JSON)
次の表に、Recommender API レスポンス中の重要なフィールドを示します。

プロパティ サブタイプに関連 説明
recommenderSubtype パーティションまたはクラスタ 推奨の種類を示します。
content.overview.partitionColumn パーティション パーティショニングを推奨する列の名前。
content.overview.partitionTimeUnit パーティション 推奨されるパーティショニングの時間単位。たとえば、DAY は、該当の列を日単位でパーティショニングすることが推奨されていることを意味します。
content.overview.clusterColumns クラスタ クラスタリングを推奨する列の名前。

gcloud CLI を使用してテーブルの分析情報を表示するには、gcloud recommender insights list コマンドを使用します。

gcloud recommender insights list \
    --project=PROJECT_NAME \
    --location=REGION_NAME \
    --insight-type=google.bigquery.table.StatsInsight \
    --format=FORMAT_TYPE \

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

  • PROJECT_NAME: BigQuery テーブルを含むプロジェクトの名前
  • REGION_NAME: プロジェクトが存在するリージョン
  • FORMAT_TYPE: サポートされている gcloud CLI 出力形式(例えば、JSON)
次の表に、insights API レスポンスの重要なフィールドを示します。

プロパティ サブタイプに関連 説明
content.existingPartitionColumn クラスタ 既存のパーティショニング列(存在する場合)
content.tableSizeTb すべて テーブルのサイズ(テラバイト単位)
content.bytesReadMonthly すべて テーブルから読み取られた月間のバイト数
content.slotMsConsumedMonthly すべて テーブルで実行されているワークロードが消費した月間のスロット時間(ミリ秒単位)
content.queryJobsCountMonthly すべて テーブルで実行されている月間のジョブ数

REST API

特定のプロジェクトに関するパーティションまたはクラスタの推奨事項を表示するには、REST API を使用します。各コマンドに認証トークンを指定する必要があります。これは gcloud CLI を使用して取得できます。認証トークンの取得方法については、ID トークンの取得方法をご覧ください。

curl list リクエストを使用して、特定のプロジェクトのすべての推奨事項を表示できます。

curl
    -H "Authorization: Bearer $GCLOUD_AUTH_TOKEN"
    -H "x-goog-user-project: PROJECT_NAME" https://recommender.googleapis.com/v1/projects/my-project/locations/us/recommenders/google.bigquery.table.PartitionClusterRecommender/recommendations

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

  • GCLOUD_AUTH_TOKEN: 有効な gcloud CLI アクセス トークンの名前
  • PROJECT_NAME: BigQuery テーブルを含むプロジェクトの名前
次の表に、Recommender API レスポンス中の重要なフィールドを示します。

プロパティ サブタイプに関連 説明
recommenderSubtype パーティションまたはクラスタ 推奨の種類を示します。
content.overview.partitionColumn パーティション パーティショニングを推奨する列の名前。
content.overview.partitionTimeUnit パーティション 推奨されるパーティショニングの時間単位。たとえば、DAY は、該当の列を日単位でパーティショニングすることが推奨されていることを意味します。
content.overview.clusterColumns クラスタ クラスタリングを推奨する列の名前。

REST API を使用してテーブルの分析情報を表示するには、次のコマンドを実行します。

curl
-H "Authorization: Bearer $GCLOUD_AUTH_TOKEN"
-H "x-goog-user-project: PROJECT_NAME" https://recommender.googleapis.com/v1/projects/my-project/locations/us/insightTypes/google.bigquery.table.StatsInsight/insights

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

  • GCLOUD_AUTH_TOKEN: 有効な gcloud CLI アクセス トークンの名前
  • PROJECT_NAME: BigQuery テーブルを含むプロジェクトの名前
次の表に、分析情報 API レスポンス中の重要なフィールドを示します。

プロパティ サブタイプに関連 説明
content.existingPartitionColumn クラスタ 既存のパーティショニング列(存在する場合)
content.tableSizeTb すべて テーブルのサイズ(テラバイト単位)
content.bytesReadMonthly すべて テーブルから読み取られた月間のバイト数
content.slotMsConsumedMonthly すべて テーブルで実行されているワークロードが消費した月間のスロット時間(ミリ秒単位)
content.queryJobsCountMonthly すべて テーブルで実行されている月間のジョブ数

クラスタの推奨事項を適用する

クラスタの推奨事項を適用するには、次のいずれかを行います。

クラスタを元のテーブルに直接適用する

クラスタの推奨事項は、既存の BigQuery テーブルに直接適用できます。この方法は、コピーしたテーブルに推奨事項を適用するよりも迅速ですが、バックアップ テーブルは保持されません。

パーティション分割されていないテーブルまたはパーティション分割テーブルに新しいクラスタリング仕様を適用する手順は次のとおりです。

  1. bq ツールで、新しいクラスタリングと一致するようにテーブルのクラスタリング仕様を更新します。

     bq update --clustering_fields=CLUSTER_COLUMN DATASET.ORIGINAL_TABLE 

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

    • CLUSTER_COLUMN: クラスタリングする列(例: mycolumn
    • DATASET: テーブルを含むデータセットの名前(例: mydataset
    • ORIGINAL_TABLE: 元のテーブルの名前(例: mytable

    tables.update または tables.patch の API メソッドを呼び出して、クラスタリング仕様を変更することもできます。

  2. 新しいクラスタリング仕様に従ってすべての行をクラスタ化するには、次の UPDATE ステートメントを実行します。

    UPDATE DATASET.ORIGINAL_TABLE SET CLUSTER_COLUMN=CLUSTER_COLUMN WHERE true

コピーしたテーブルにクラスタを適用する

BigQuery テーブルにクラスタの推奨事項を適用するときに、まず元のテーブルをコピーしてから、コピーしたテーブルに推奨事項を適用します。この方法では、変更をクラスタリング構成にロールバックする必要がある場合に、元のデータが確実に保持されます。

この方法を使用すると、パーティション分割されていないテーブルとパーティション分割されたテーブルの両方にクラスタの推奨事項を適用できます。

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

    [BigQuery] に移動

  2. Query Editor で、LIKE 演算子を使用して、元のテーブルと同じメタデータ(クラスタリング仕様を含む)を含む空のテーブルを作成します。

    CREATE TABLE DATASET.COPIED_TABLE
    LIKE DATASET.ORIGINAL_TABLE

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

    • DATASET: テーブルを含むデータセットの名前(例: mydataset
    • COPIED_TABLE: コピーしたテーブルの名前(例: copy_mytable
    • ORIGINAL_TABLE: 元のテーブルの名前(例: mytable
  3. Google Cloud コンソールで、Cloud Shell エディタを開きます。

    Cloud Shell をアクティブにする

  4. Cloud Shell エディタで、bq update コマンドを使用して、コピーしたテーブルのクラスタリング仕様を推奨されたクラスタリングと一致するように更新します。

     bq update --clustering_fields=CLUSTER_COLUMN DATASET.COPIED_TABLE 

    CLUSTER_COLUMN は、クラスタリングする列(例えば、mycolumn)に置き換えます。

    tables.update または tables.patch の API メソッドを呼び出して、クラスタリング仕様を変更することもできます。

  5. パーティショニングまたはクラスタリングが存在する場合は、クエリエディタで、元のテーブルのパーティショニングとクラスタリングの構成を使用してテーブル スキーマを取得します。スキーマを取得するには、元のテーブルの INFORMATION_SCHEMA.TABLES ビューを表示します。

    SELECT
      ddl
    FROM
      DATASET.INFORMATION_SCHEMA.TABLES
    WHERE
      table_name = 'DATASET.ORIGINAL_TABLE;'

    出力は、PARTITION BY 句を含む ORIGINAL_TABLE の完全なデータ定義言語(DDL)ステートメントです。DDL 出力の引数の詳細については、CREATE TABLE ステートメントをご覧ください。

    DDL 出力には、元のテーブルのパーティショニング タイプが表示されます。

    パーティショニング タイプ 出力の例
    パーティション分割なし PARTITION BY 句が存在しない。
    テーブル列によるパーティション分割 PARTITION BY c0
    PARTITION BY DATE(c0)
    PARTITION BY DATETIME_TRUNC(c0, MONTH)
    取り込み時間によるパーティション分割 PARTITION BY _PARTITIONDATE
    PARTITION BY DATETIME_TRUNC(_PARTITIONTIME, MONTH)
  6. コピーしたテーブルにデータを取り込みます。使用するプロセスは、パーティション タイプに従って決まります。

    • 元のテーブルがパーティション分割されていないか、テーブル列によってパーティション分割されている場合は、元のテーブルからコピーしたテーブルにデータを取り込みます。
      INSERT INTO DATASET.COPIED_TABLE
      SELECT * FROM DATASET.ORIGINAL_TABLE
    • 元のテーブルが取り込み時間によってパーティション分割されている場合は、次の手順に沿って操作します。

      1. INFORMATION_SCHEMA.COLUMNS ビューを使用して、データ取り込み式を形成する列のリストを取得します。

        SELECT
        ARRAY_TO_STRING((
        SELECT
          ARRAY(
          SELECT
            column_name
          FROM
            DATASET.INFORMATION_SCHEMA.COLUMNS
          WHERE
            table_name = 'ORIGINAL_TABLE')), ", ")

        出力は、列名のカンマ区切りのリストです。

      2. 元のテーブルからコピーされたテーブルにデータを取り込みます。

        INSERT DATASET.COPIED_TABLE (COLUMN_NAMES, _PARTITIONTIME)
        SELECT *, _PARTITIONTIME FROM DATASET.ORIGINAL_TABLE

        COLUMN_NAMES は、前のステップの出力である列のカンマ区切りのリスト(たとえば、col1, col2, col3)に置き換えます。

    これで、元のテーブルと同じデータを含むクラスタ化されたテーブルが作成されました。次のステップでは、元のテーブルを新しくクラスタ化されたテーブルに置き換えます。

  7. 元のテーブルの名前をバックアップ テーブルに変更します。

    ALTER TABLE DATASET.ORIGINAL_TABLE
    RENAME TO DATASET.BACKUP_TABLE

    BACKUP_TABLE は、バックアップ テーブルの名前(たとえば、backup_mytable)に置き換えます。

  8. コピーされたテーブルの名前を元のテーブルに変更します。

    ALTER TABLE DATASET.COPIED_TABLE
    RENAME TO DATASET.ORIGINAL_TABLE

    これで、元のテーブルがクラスタの推奨事項に従ってクラスタ化されました。

クラスタ化テーブルをチェックして、すべてのテーブル機能が意図したとおりに機能するかどうか確認することをおすすめします。多くのテーブル機能はテーブル名ではなくテーブル ID に関連付けられている可能性があるため、続行する前に次のテーブル機能を確認することをおすすめします。

問題が発生した場合は、影響を受けるアーティファクトを新しいテーブルに手動で移行する必要があります。

クラスタ化テーブルを確認したら、必要に応じて、次のコマンドでバックアップ テーブルを削除できます。
    DROP TABLE DATASET.BACKUP_TABLE
    

マテリアライズド ビューでクラスタを適用する

テーブルのマテリアライズド ビューを作成して、推奨事項が適用された元のテーブルのデータを保存できます。マテリアライズド ビューを使用して推奨事項を適用することで、クラスタ化されたデータを自動更新によって常に最新の状態に保つことができます。マテリアライズド ビューをクエリ、管理、保存する場合は、料金に関する考慮事項があります。クラスタ化されたマテリアライズド ビューの作成方法については、クラスタ化されたマテリアライズド ビューをご覧ください。

パーティションの推奨事項を適用する

パーティションの推奨事項を適用するには、元のテーブルのコピーに適用する必要があります。BigQuery では、テーブルのパーティショニング スキーマの変更はサポートされていません。たとえば、パーティション分割されていないテーブルをパーティション分割テーブルに変更すること、テーブルのパーティショニング スキーマを変更すること、ベーステーブルとは異なるパーティショニング スキーマを使用してマテリアライズド ビューを作成することはできません。テーブルのパーティショニングを変更できるのは、テーブルのコピーに対してのみです。

コピーしたテーブルにパーティションの推奨事項を適用する

BigQuery テーブルにパーティションの推奨事項を適用するときは、まず元のテーブルをコピーしてから、コピーしたテーブルに推奨事項を適用します。このアプローチにより、パーティションをロールバックする必要がある場合に、元のデータが保持されます。

次の手順では、推奨事項の例を使用して、パーティション時間単位 DAY でテーブルをパーティション分割します。

  1. パーティションの推奨事項を使用して、テーブルのコピーを作成します。

    CREATE TABLE DATASET.COPIED_TABLE
    PARTITION BY DATE_TRUNC(PARTITION_COLUMN, DAY)
    AS SELECT * FROM DATASET.ORIGINAL_TABLE

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

    • DATASET: テーブルを含むデータセットの名前(例: mydataset
    • COPIED_TABLE: コピーしたテーブルの名前(例: copy_mytable
    • PARTITION_COLUMN: パーティショニングする列(例: mycolumn

    パーティション分割テーブルの作成の詳細については、パーティション分割テーブルの作成をご覧ください。

  2. 元のテーブルの名前をバックアップ テーブルに変更します。

    ALTER TABLE DATASET.ORIGINAL_TABLE
    RENAME TO DATASET.BACKUP_TABLE

    BACKUP_TABLE は、バックアップ テーブルの名前(たとえば、backup_mytable)に置き換えます。

  3. コピーされたテーブルの名前を元のテーブルに変更します。

    ALTER TABLE DATASET.COPIED_TABLE
    RENAME TO DATASET.ORIGINAL_TABLE

    これで、元のテーブルがパーティションの推奨事項に従ってパーティション分割されました。

パーティション分割テーブルをチェックして、すべてのテーブル機能が意図したとおりに機能するかどうか確認することをおすすめします。多くのテーブル機能はテーブル名ではなくテーブル ID に関連付けられている可能性があるため、続行する前に次のテーブル機能を確認することをおすすめします。

問題が発生した場合は、影響を受けるアーティファクトを新しいテーブルに手動で移行する必要があります。

パーティション分割テーブルを確認したら、必要に応じて、次のコマンドでバックアップ テーブルを削除できます。
    DROP TABLE DATASET.BACKUP_TABLE
    

料金

この機能の料金の詳細については、Gemini in BigQuery の料金の概要をご覧ください。

テーブルに推奨事項を適用すると、次の費用が発生する可能性があります。

  • 処理費用。推奨事項を適用する際は、BigQuery プロジェクトにデータ定義言語(DDL)クエリまたはデータ操作言語(DML)クエリを実行します。
  • ストレージの費用。テーブルをコピーする場合は、コピーした(またはバックアップの)テーブル用に追加のストレージを使用します。

標準の処理料金とストレージ料金が、プロジェクトに関連付けられた請求先アカウントに応じて適用されます。詳細については、BigQuery の料金をご覧ください。

割り当てと上限

この機能の割り当てと上限については、Gemini in BigQuery の割り当てをご覧ください。

トラブルシューティング

問題: 特定のテーブルに対する推奨事項が表示されない。

次のような状況では、パーティションとクラスタの推奨事項が表示されないことがあります。

  • テーブルが 10 GB 未満。
  • データ操作言語(DML)オペレーションによるテーブルの書き込みコストが高い。
  • テーブルが過去 30 日間読み取られていない。
  • 1 か月あたりの推定削減額が少なすぎる(1 スロット時間未満の削減)。
  • テーブルがすでにクラスタ化されている。