クラスタ化テーブルのクエリ
BigQuery でクラスタ化テーブルを作成すると、テーブルのスキーマ内の 1 つ以上の列のコンテンツに基づいて、テーブルデータが自動的に分類されます。指定した列は、関連するデータを同じ場所に配置するために使用されます。複数の列を使用してテーブルをクラスタ化する場合は、指定する列の順序が重要です。指定した列の順序によって、データの並べ替え順序が決まります。
クラスタ化テーブルに対してクエリを実行するときのパフォーマンスを最適化するには、クラスタ化列を指定した際の順序で、1 つまたは複数のクラスタ化列をフィルタリングする式を使用します。通常、クラスタ化列でフィルタリングするクエリは、非クラスタ化列のみでフィルタリングするクエリよりも優れたパフォーマンスを発揮します。
BigQuery は、クラスタリング列の値に基づいてクラスタ化テーブルのデータを並べ替えて、データをブロックに整理します。
クラスタ化列のフィルタを含むクエリを送信すると、BigQuery はクラスタリング情報を使用して、クエリに関連するデータがブロックに含まれているかどうかを効率的に判断します。これにより、BigQuery は関連するブロックのみをスキャンできます。このプロセスをブロック プルーニングと呼びます。
次の方法で、クラスタ化テーブルにクエリを実行できます。
- Google Cloud コンソールを使用する
- bq コマンドライン ツールの
bq query
コマンドを使用する jobs.insert
メソッドを呼び出してクエリジョブを構成する- クライアント ライブラリの使用
現在、クラスタ化テーブルでは GoogleSQL のみを使用できます。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。
必要な権限
クエリジョブを実行するには、そのクエリジョブを実行するプロジェクトに対する bigquery.jobs.create
Identity and Access Management(IAM)権限が必要です。
次の各事前定義 IAM ロールには、クエリジョブを実行するために必要な権限が含まれています。
roles/bigquery.admin
roles/bigquery.jobUser
roles/bigquery.user
また、クエリで参照するすべてのテーブルとビューに対する bigquery.tables.getData
権限も必要です。さらに、ビューをクエリする場合は、基盤となるすべてのテーブルとビューに対してこの権限が必要になります。ただし、承認済みビューまたは承認済みデータセットを使用する場合は、基礎となるソースデータにアクセスする必要はありません。
次の各 IAM 事前定義ロールには、クエリで参照するすべてのテーブルとビューに対して必要な権限が含まれています。
roles/bigquery.admin
roles/bigquery.dataOwner
roles/bigquery.dataEditor
roles/bigquery.dataViewer
BigQuery での IAM のロールの詳細については、事前定義ロールと権限をご覧ください。
おすすめの方法
クラスタ化テーブルに対するクエリから最高のパフォーマンスを得るには、次のベスト プラクティスを使用します。
コンテキストで、ベスト プラクティスの例で使用されているサンプル テーブルは、DDL ステートメントを使用して作成されたクラスタ化テーブルです。この DDL ステートメントは、ClusteredSalesData
という名前のテーブルを作成します。テーブルは、以下の customer_id
列、product_id
列、order_id
列によって、その並べ替え順序でクラスタ化されます。
CREATE TABLE `mydataset.ClusteredSalesData` PARTITION BY DATE(timestamp) CLUSTER BY customer_id, product_id, order_id AS SELECT * FROM `mydataset.SalesData`
並べ替え順序でクラスタ化列をフィルタリングする
フィルタを指定するときは、並べ替え順序でクラスタ化列をフィルタリングする式を使用します。並べ替え順序は、CLUSTER BY
句で指定された列の順序です。クラスタリングの利点を得るには、クラスタ化されたすべての列または列のサブセットを左から右の並べ替え順序で含めます(最初の列から始めます)。たとえば、列の並べ替え順序が A
、B
、C
の場合、A
と B
でフィルタリングするクエリはクラスタリングの恩恵を受ける可能性がありますが、B
と C
でフィルタリングするクエリはそうなりません。フィルタ式内の列名の順序は、パフォーマンスに影響しません。
次の例では、前の例で作成した ClusteredSalesData
クラスタ化テーブルをクエリします。クエリには、customer_id
でフィルタリングし、次に product_id
でフィルタリングするフィルタ式が含まれています。このクエリは、並べ替え順序でクラスタ化列をフィルタリングしているため、CLUSTER BY
句で指定された列の順序でフィルタリングすることでパフォーマンスが最適化されます。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000 AND product_id LIKE 'gcp_analytics%'
次のクエリは、フィルタリングにおいてクラスタ化列が並べ替え順序になっていません。その結果、このクエリのパフォーマンスは最適化されません。このクエリでは、最初に product_id
でフィルタリングされ、次に order_id
でフィルタリングされます(customer_id
はスキップしています)。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE product_id LIKE 'gcp_analytics%' AND order_id = 20000
複雑なフィルタ式ではクラスタ化列を使用しない
複雑なフィルタ式でクラスタ化列を使用すると、ブロック プルーニングを適用できないため、クエリのパフォーマンスが最適化されません。
たとえば、次のクエリは、クラスタ化列(customer_id
)がフィルタ式の関数の中で使用されているため、ブロック プルーニングが行われません。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE CAST(customer_id AS STRING) = "10000"
ブロック プルーニングによってクエリのパフォーマンスを最適化するには、次のような単純なフィルタ式を使用します。この例では、単純なフィルタがクラスタ化列(customer_id
)に適用されます。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000
クラスタ化列を他の列と比較しない
フィルタ式でクラスタ化列を他の列(クラスタ化列、非クラスタ化列のいずれでも)と比較する場合、ブロック プルーニングを適用できないため、クエリのパフォーマンスは最適化されません。
次のクエリでは、フィルタ式でクラスタ化列(customer_id
)と他の列(order_id
)を比較しているため、ブロック プルーニングが行われません。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = order_id
テーブルのセキュリティ
BigQuery でテーブルへのアクセスを制御するには、テーブルのアクセス制御の概要をご覧ください。
次のステップ
- クエリの実行の詳細については、インタラクティブ クエリとバッチクエリの実行をご覧ください。
- クラスタ化テーブルを作成して使用する方法については、クラスタ化テーブルの作成と使用をご覧ください。
- BigQuery でのパーティション分割テーブルのサポートの概要については、パーティション分割テーブルの概要をご覧ください。
- パーティション分割テーブルの作成方法については、パーティション分割テーブルの作成をご覧ください。