コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

クラスタ化テーブルの概要

BigQuery のクラスタ化テーブルは、クラスタ化列を使用したユーザー定義の列並べ替え順序があるテーブルです。クラスタ化テーブルを使用すると、クエリのパフォーマンスが向上し、クエリ費用を削減できます。

BigQuery におけるクラスタ化列は、クラスタ化列の値に基づいてストレージ ブロックを並べ替えるユーザー定義のテーブル プロパティです。ストレージ ブロックは、テーブルのサイズに基づいて適応的にサイズ設定されます。クラスタ化テーブルは、テーブルを変更する各オペレーションのコンテキストの中で並べ替えプロパティを維持します。クラスタ化列でフィルタや集計を行うクエリは、テーブルやテーブル パーティション全体ではなく、クラスタ化列に基づいて関連するブロックのみをスキャンします。その結果、BigQuery は、クエリで処理されるバイト数、またはクエリの費用を正確に見積もることができない場合でも、実行時に合計バイト数の削減を試みます。

BigQuery がデータを並べ替えてストレージ ブロックにグループ化する際、複数の列を使用してテーブルをクラスタ化する場合は、列の順序が優先されます。次の例では、クラスタ化されていないテーブルの論理ストレージ ブロック レイアウトと、1 つまたは複数のクラスタ化列を持つクラスタ化テーブルのレイアウトを比較します。

BigQuery はクラスタ化テーブルのデータを並べ替えて、クエリのパフォーマンスを向上させます。

クラスタ化テーブルに対してクエリを実行する場合、クエリを実行する前はスキャンされるストレージ ブロック数が不明なため、正確なクエリ費用の見積りを得られません。最終的な費用は、クエリの完了後に、スキャンされた特定のストレージ ブロックに基づいて求められます。

クラスタリングを使用する場合

次のようなシナリオでは、クラスタ化を検討してください。

  • 通常、クエリが特定の列をフィルタする場合。クラスタ化では、フィルタに一致するブロックのみがスキャンされるため、クエリが高速化されます。
  • クエリで、多数の異なる値を持つ列をフィルタする場合。クラスタ化により、入力データの取得先に関する詳細なメタデータが BigQuery で処理され、クエリが高速化されます。
  • クエリを実行する前に厳密な費用見積もりが必要ない場合。

次のような状況では、クラスタ化以外の方法を検討してください。

  • クエリを実行する前に、クエリ費用を厳密に見積る必要がある場合。クラスタ化テーブルのクエリの料金は、クエリ実行後にのみわかります。
  • クエリテーブルが 1 GB 未満の場合。通常、1 GB 未満のテーブルでは、クラスタ化してもパフォーマンスが大きく向上しません。

クラスタ化は、テーブルを保存する仕組みに対するものであるため、通常はクエリのパフォーマンスを向上させる最初の選択肢になります。異なる方法や追加の方法が必要な場合は、テーブルのパーティショニングを検討してください。

クラスタ化と同様、パーティショニングでは、ユーザー定義のパーティション列を使用して、データのパーティショニング方法と各パーティションに保存されるデータを指定します。クラスタ化とは異なり、パーティショニングでは、クエリを実行する前により詳細なクエリ費用を見積もることができます。クラスタ化と同様、クエリでスキャンされるデータの量は、パーティショニングによって減少するとは限りません。その量は、パーティション列として設定した内容と、実行時にこれらの列がクエリフィルタとしてどのように使用されるかによって異なります。

もう 1 つは、クラスタ化とテーブル パーティショニングを組み合わせる方法です。この方法では、まずデータをパーティションに分割してから、クラスタ化列ごとに各パーティション内のデータをクラスタ化します。詳細については、このドキュメントのクラスタ化テーブルとパーティション分割テーブルをご覧ください。

クラスタ列の型と順序

このセクションでは、テーブルのクラスタ化での列の型と列の順序について説明します。

クラスタ列の型

クラスタ列は、最上位の繰り返しでない列であることが必要です。データ型は次のいずれかでなければなりません。

  • STRING
  • INT64
  • NUMERIC
  • BIGNUMERIC
  • DATE
  • DATETIME
  • TIMESTAMP
  • BOOL
  • GEOGRAPHY

データ型の詳細については、Google 標準 SQL のデータ型をご覧ください。

クラスタ列の順序

クラスタ化列の順序は、クエリのパフォーマンスに影響します。クラスタ化を活用するには、クエリフィルタの順序がクラスタ化列の順序と一致し、少なくとも最初のクラスタ化列が含まれている必要があります。

次の例では、順序表は Order_DateCountryStatus の列並べ替え順序を使用してクラスタ化されます。Order_DateCountry でフィルタするクエリはクラスタ化用に最適化されていますが、CountryStatus についてのみフィルタするクエリは最適化されていません。クラスタ化の結果を最適化するには、最初のクラスタ化列から並んだ列からフィルタする必要があります。

クラスタ化テーブルのクエリには、最初の列からクラスタ化列を含める必要があります。

クラスタ化テーブルとパーティション分割テーブル

テーブル クラスタ化とテーブル パーティショニングを組み合わせると、クエリを細かく最適化できます。

パーティション分割テーブルでは、データが物理ブロックに保存され、各ブロックに 1 つのデータ パーティションが保持されます。各パーティション分割テーブルには、そのテーブルを変更するすべてのオペレーションについて、並べ替えプロパティに関するさまざまなメタデータが保持されます。メタデータを使用すると、BigQuery でクエリの実行前にクエリをより正確に見積もることができます。ただし、パーティショニングでは、パーティション分割テーブル以外のテーブルより多くのメタデータを BigQuery で保持する必要があります。パーティションの数が増えると、保持されるメタデータの量も増加します。

クラスタ化と分割が行われるテーブルを作成すると、次の図に示すように、より詳細な並べ替えが可能になります。

クラスタ化や分割をされていないテーブルと、クラスタ化または分割されたテーブルの比較。

自動再クラスタリング

データがクラスタ化テーブルに追加されると、新しいデータはブロックに編成されます。これにより、新しいストレージ ブロックの作成や既存のブロックの更新が行われる可能性があります。新しいデータは同じクラスタ値を持つ既存のデータとグループ化されないため、クエリとストレージのパフォーマンスを最適化するにはブロック最適化が必要です。

クラスタ化されたテーブルのパフォーマンス特性を維持するため、BigQuery はバックグラウンドで自動再クラスタ化を実行します。パーティション分割テーブルでは、各パーティションの範囲内のデータに対してクラスタ化が維持されます。

制限事項

  • クラスタ化テーブルのクエリと、クラスタ化テーブルに対するクエリ結果の書き込みには、Google 標準 SQL のみがサポートされています。
  • 最大 4 つのクラスタ化列を指定できます。追加の列が必要な場合は、クラスタ化とパーティショニングを組み合わせることを検討してください。
  • クラスタ化に STRING 型の列を使用する場合、BigQuery は最初の 1,024 文字のみを使用してデータをクラスタ化します。列の値自体は 1,024 文字を超える場合があります。
  • 既存のクラスタ化されていないテーブルをクラスタ化するように変更すると、既存のデータはクラスタ化されません。クラスタ化列を使用して新しいデータのみが保存され、自動再クラスタ化が適用されます。

クラスタ化テーブルの割り当てと上限

BigQuery では、特定のテーブル オペレーションや 1 日あたりのジョブ数の制限など、割り当てと上限がある共有 Google Cloud リソースの使用が制限されます。

分割テーブルとともにクラスタ化テーブルの機能を使用すると、分割テーブルの制限が適用されます。

割り当てと上限は、クラスタ化テーブルに対して実行されるさまざまな種類のジョブにも適用されます。テーブルに適用されるジョブ割り当てについては、「割り当てと上限」のジョブをご覧ください。

クラスタ化テーブルの料金

BigQuery でクラスタ化テーブルを作成して使用する場合は、テーブルに保存されるデータの量と、データに対して実行するクエリに基づいて料金が発生します。詳細については、ストレージの料金クエリの料金をご覧ください。

他の BigQuery テーブル オペレーションと同様、クラスタ化テーブル オペレーションでは、一括読み込み、テーブルコピー、自動再クラスタ化、データ エクスポートなどの BigQuery の無料オペレーションを利用できます。これらのオペレーションには、BigQuery の割り当てと上限が適用されます。無料のオペレーションについては、無料のオペレーションをご覧ください。

クラスタ化テーブルの料金設定の例について詳しくは、ストレージとクエリの費用の見積もりをご覧ください。

テーブルのセキュリティ

BigQuery でテーブルへのアクセスを制御するには、テーブルのアクセス制御の概要をご覧ください。

次のステップ