パーティションとクラスタの推奨事項を適用する
このドキュメントでは、パーティションとクラスタの推奨事項を BigQuery テーブルに適用する方法について説明します。
制限事項
パーティショニングとクラスタリングの Recommender は、レガシー SQL を使用した BigQuery テーブルをサポートしていません。Recommender は、推奨事項を生成するときに、分析でレガシー SQL クエリを除外します。また、レガシー SQL を使用して BigQuery テーブルにパーティションの推奨事項を適用すると、そのテーブル内のレガシー SQL ワークフローがすべて機能しなくなります。
パーティションの推奨事項を適用する前に、レガシー SQL ワークフローを GoogleSQL に移行してください。
パーティショニングとクラスタリングの Recommender は、次のリージョンに保存されているリソースをサポートしません。
europe-central2
、europe-west8
、europe-west9
、europe-west12
、europe-north1
、europe-southwest1
us-east1
、us-east5
、us-south1
me-central1
、me-central2
、me-west1
australia-southeast2
southamerica-west1
始める前に
- Recommender API が有効になっていることを確認します。
- 必要な Identity and Access Management(IAM)権限があることを確認します。
クラスタの推奨事項を適用する
元のテーブルのコピーにクラスタを適用する、元のテーブルにそれらを直接適用する、またはマテリアライズド ビューを使用するのいずれかによって、クラスタの推奨事項を適用できます。
コピーしたテーブルにパーティションの推奨事項を適用する
BigQuery テーブルにクラスタの推奨事項を適用するときに、まず元のテーブルをコピーしてから、コピーしたテーブルに推奨事項を適用します。この方法では、変更をクラスタリング構成にロールバックする必要がある場合に、元のデータが確実に保持されます。
この方法を使用すると、パーティション分割されていないテーブルとパーティション分割されたテーブルの両方にクラスタの推奨事項を適用できます。
Google Cloud コンソールで [BigQuery] ページに移動します。
Query Editor で、
LIKE
演算子を使用して、元のテーブルと同じメタデータ(クラスタリング仕様を含む)を含む空のテーブルを作成します。CREATE TABLE DATASET.COPIED_TABLE LIKE DATASET.ORIGINAL_TABLE
次のように置き換えます。
DATASET
: テーブルを含むデータセットの名前(例:mydataset
)COPIED_TABLE
: コピーしたテーブルの名前(例:copy_mytable
)ORIGINAL_TABLE
: 元のテーブルの名前(例:mytable
)
Google Cloud コンソールで、Cloud Shell エディタを開きます。
Cloud Shell エディタで、
bq update
コマンドを使用して、コピーしたテーブルのクラスタリング仕様を推奨されたクラスタリングと一致するように更新します。bq update --clustering_fields=CLUSTER_COLUMN DATASET.COPIED_TABLE
CLUSTER_COLUMN
は、クラスタリングする列(例えば、mycolumn
)に置き換えます。tables.update
またはtables.patch
の API メソッドを呼び出して、クラスタリング仕様を変更することもできます。パーティショニングまたはクラスタリングが存在する場合は、クエリエディタで、元のテーブルのパーティショニングとクラスタリングの構成を使用してテーブル スキーマを取得します。スキーマを取得するには、元のテーブルの
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)
コピーしたテーブルにデータを取り込みます。使用するプロセスは、パーティション タイプに従って決まります。
- 元のテーブルがパーティション分割されていないか、テーブル列によってパーティション分割されている場合は、元のテーブルからコピーしたテーブルにデータを取り込みます。
INSERT INTO DATASET.COPIED_TABLE SELECT * FROM DATASET.ORIGINAL_TABLE
元のテーブルが取り込み時間によってパーティション分割されている場合は、次の手順に沿って操作します。
INFORMATION_SCHEMA.COLUMNS
ビューを使用して、データ取り込み式を形成する列のリストを取得します。SELECT ARRAY_TO_STRING(( SELECT ARRAY( SELECT column_name FROM DATASET.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'ORIGINAL_TABLE')), ", ")
出力は、列名のカンマ区切りのリストです。
元のテーブルからコピーしたテーブルにデータを取り込みます。
INSERT DATASET.COPIED_TABLE (COLUMN_NAMES, _PARTITIONTIME) SELECT *, _PARTITIONTIME FROM DATASET.ORIGINAL_TABLE
COLUMN_NAMES
を、前のステップの出力である列のカンマ区切りのリスト(例えば、col1, col2, col3
)に置き換えます。
これで、元のテーブルと同じデータを含むクラスタ化されたコピーテーブルが作成されました。次のステップでは、元のテーブルを新しくクラスタ化されたテーブルに置き換えます。
- 元のテーブルがパーティション分割されていないか、テーブル列によってパーティション分割されている場合は、元のテーブルからコピーしたテーブルにデータを取り込みます。
元のテーブルの名前をバックアップ テーブルに変更します。
ALTER TABLE DATASET.ORIGINAL_TABLE RENAME TO DATASET.BACKUP_TABLE
BACKUP_TABLE
はバックアップ テーブルの名前(例えば、backup_mytable
)に置き換えます。コピーしたテーブルの名前を元のテーブルに変更します。
ALTER TABLE DATASET.COPIED_TABLE RENAME TO DATASET.ORIGINAL_TABLE
これで、元のテーブルがクラスタの推奨事項に従ってクラスタ化されました。
- IAM 権限、行レベルのアクセス、列レベルのアクセスなどのアクセスと権限。
- テーブル クローン、テーブル スナップショット、検索インデックスなどのテーブル アーティファクト。
- マテリアライズド ビューやテーブルをコピーした際に実行されたジョブなど、進行中のテーブル プロセスのステータス。
- タイムトラベルを使用して過去のテーブルデータにアクセスする能力。
- 元のテーブルに関連付けられているメタデータ(例:
table_option_list
、column_option_list
)。詳細については、データ定義言語ステートメントをご覧ください。
問題が発生した場合は、影響を受けるアーティファクトを新しいテーブルに手動で移行する必要があります。
クラスタ化テーブルを確認したら、必要に応じて、次のコマンドでバックアップ テーブルを削除できます。DROP TABLE DATASET.BACKUP_TABLE
クラスタの推奨事項を直接適用する
クラスタの推奨事項は、既存の BigQuery テーブルに直接適用できます。この方法は、コピーしたテーブルに推奨事項を適用するよりも迅速ですが、バックアップ テーブルは保持されません。
パーティション分割されていないテーブルまたはパーティション分割テーブルに新しいクラスタリング仕様を適用する手順は次のとおりです。
bq ツールで、新しいクラスタリングと一致するようにテーブルのクラスタリング仕様を更新します。
bq update --clustering_fields=CLUSTER_COLUMN DATASET.ORIGINAL_TABLE
次のように置き換えます。
CLUSTER_COLUMN
: クラスタリングする列(例:mycolumn
)DATASET
: テーブルを含むデータセットの名前(例:mydataset
)ORIGINAL_TABLE
: 元のテーブルの名前(例:mytable
)
tables.update
またはtables.patch
の API メソッドを呼び出して、クラスタリング仕様を変更することもできます。新しいクラスタリング仕様に従ってすべての行をクラスタ化するには、次の
UPDATE
ステートメントを実行します。UPDATE DATASET.ORIGINAL_TABLE SET CLUSTER_COLUMN=CLUSTER_COLUMN WHERE true
マテリアライズド ビューを使用してクラスタの推奨事項を適用する
テーブルのマテリアライズド ビューを作成して、推奨事項が適用された元のテーブルのデータを保存できます。マテリアライズド ビューを使用して推奨事項を適用することで、クラスタ化されたデータを自動更新によって常に最新の状態に保つことができます。マテリアライズド ビューをクエリ、管理、保存する場合は、料金に関する考慮事項があります。クラスタ化されたマテリアライズド ビューの作成方法については、クラスタ化されたマテリアライズド ビューをご覧ください。パーティションの推奨事項を適用する
パーティションの推奨事項を適用するには、元のテーブルのコピーにパーティションを適用します。
コピーしたテーブルにパーティションの推奨事項を適用する
BigQuery テーブルにパーティションの推奨事項を適用するときは、まず元のテーブルをコピーしてから、コピーしたテーブルに推奨事項を適用します。このアプローチにより、パーティションをロールバックする必要がある場合に、元のデータが保持されます。
次の手順では、推奨事項の例を使用して、パーティション時間単位 DAY
でテーブルをパーティション分割します。
パーティションの推奨事項を使用して、テーブルのコピーを作成します。
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
)
パーティション分割テーブルの作成の詳細については、パーティション分割テーブルの作成をご覧ください。
元のテーブルの名前をバックアップ テーブルに変更します。
ALTER TABLE DATASET.ORIGINAL_TABLE RENAME TO DATASET.BACKUP_TABLE
BACKUP_TABLE
はバックアップ テーブルの名前(例えば、backup_mytable
)に置き換えます。コピーしたテーブルの名前を元のテーブルに変更します。
ALTER TABLE DATASET.COPIED_TABLE RENAME TO DATASET.ORIGINAL_TABLE
これで、元のテーブルがパーティションの推奨事項に従ってパーティション分割されました。
- IAM 権限、行レベルのアクセス、列レベルのアクセスなどのアクセスと権限。
- テーブル クローン、テーブル スナップショット、検索インデックスなどのテーブル アーティファクト。
- マテリアライズド ビューやテーブルをコピーした際に実行されたジョブなど、進行中のテーブル プロセスのステータス。
- タイムトラベルを使用して過去のテーブルデータにアクセスする能力。
- 元のテーブルに関連付けられているメタデータ(例:
table_option_list
、column_option_list
)。詳細については、データ定義言語ステートメントをご覧ください。 - レガシー SQL を使用して、クエリ結果をパーティション分割テーブルに書き込む能力。レガシー SQL はパーティション分割テーブルでは完全にはサポートされていません。この解決策の一つは、パーティションの推奨事項の適用前に、レガシー SQL ワークフローを GoogleSQL に移行することです。
問題が発生した場合は、影響を受けるアーティファクトを新しいテーブルに手動で移行する必要があります。
パーティション分割テーブルを確認したら、必要に応じて、次のコマンドでバックアップ テーブルを削除できます。DROP TABLE DATASET.BACKUP_TABLE
料金
テーブルに推奨事項を適用すると、次の費用が発生する可能性があります。
- 処理費用。推奨事項を適用する際は、BigQuery プロジェクトにデータ定義言語(DDL)クエリまたはデータ操作言語(DML)クエリを実行します。
- ストレージの費用。テーブルをコピーする場合は、コピーした(またはバックアップの)テーブル用に追加のストレージを使用します。
標準の処理料金とストレージ料金が、プロジェクトに関連付けられた請求先アカウントに応じて適用されます。詳細については、BigQuery の料金をご覧ください。