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

このドキュメントでは、パーティションとクラスタの推奨事項を BigQuery テーブルに適用する方法について説明します。

制限事項

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

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

パーティショニングとクラスタリングの Recommender は、次のリージョンに保存されているリソースをサポートしません。

  • europe-central2europe-west8europe-west9europe-west12europe-north1europe-southwest1
  • us-east1us-east5us-south1
  • me-central1me-central2me-west1
  • australia-southeast2
  • southamerica-west1

始める前に

  1. Recommender API が有効になっていることを確認します。
  2. 必要な Identity and Access Management(IAM)権限があることを確認します。

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

元のテーブルのコピーにクラスタを適用する元のテーブルにそれらを直接適用する、またはマテリアライズド ビューを使用するのいずれかによって、クラスタの推奨事項を適用できます。

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

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 テーブルに直接適用できます。この方法は、コピーしたテーブルに推奨事項を適用するよりも迅速ですが、バックアップ テーブルは保持されません。

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

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

次の手順では、推奨事項の例を使用して、パーティション時間単位 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
    

料金

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

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

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