パーティション分割テーブルの概要

このページでは、BigQuery でのパーティション分割テーブルのサポートの概要について説明します。

パーティション分割テーブルはパーティションと呼ばれるセグメントに分割された特殊なテーブルで、データの管理や照会をより簡単に行うことができます。大きいテーブルを小さいパーティションに分割することでクエリのパフォーマンスを向上させることができ、クエリで読み取られるバイト数を減らすことによってコストを管理できます。

BigQuery テーブルを分割する方法は次のとおりです。

取り込み時間パーティション分割テーブル

取り込み時間で分割されたテーブルを作成すると、BigQuery はデータの取り込み日または到着日を反映した日単位の日付に基づくパーティションにデータを自動的に読み込みます。疑似列 ID とサフィックス ID を使用すると、データを特定の日のパーティションに書き換え(置き換え)たり、リダイレクトできます。

取り込み時間パーティション分割テーブルには _PARTITIONTIME という疑似列があり、テーブルに読み込まれたデータの日付ベースのタイムスタンプがこの列に格納されています。時間パーティション分割テーブルに対するクエリでは、パーティションの位置を表す _PARTITIONTIME フィルタを指定することによって、読み取るデータを制限できます。指定したパーティション内のすべてのデータがクエリで読み取られますが、_PARTITIONTIME 述語フィルタによって、スキャン対象のパーティションの数が制限されます。

取り込み時間パーティション分割テーブルを作成する場合、パーティションにはテーブルと同じスキーマ定義が設定されます。パーティションとテーブルの各スキーマが異なり、データをパーティションに読み込む必要がある場合は、データを読み込む前にテーブルのスキーマを更新する必要があります。または、スキーマ更新オプションを使用して、読み込みジョブまたはクエリジョブでテーブルのスキーマを更新することもできます。

日付 / タイムスタンプ パーティション分割テーブル

BigQuery では、特定の DATE 列または TIMESTAMP 列を基準にしたパーティション分割テーブルも利用できます。日付 / タイムスタンプ パーティション分割テーブルに書き込まれたデータは、パーティショニングする列の日付値(UTC で表される)に基づいて適切なパーティションに自動的に届けられます。

日付 / タイムスタンプ パーティション分割テーブルにおける各パーティションは、範囲の開始値が 1 日の始めで、範囲の間隔が 1 日であるという範囲とみなされます。

日付 / タイムスタンプ パーティション分割テーブルに、_PARTITIONTIME 擬似列は必要ありません。日付 / タイムスタンプ パーティション分割テーブルに対するクエリでは、パーティショニング列を基準にした述語フィルタを指定して、スキャンされるデータの量を減らすことができます。

日付 / タイムスタンプ パーティション分割テーブルを作成すると、次の 2 つの特殊パーティションが作成されます。

  • __NULL__ パーティション: パーティショニングする列で NULL 値が設定されている行を表します。
  • __UNPARTITIONED__ パーティション: 日付の許容範囲外にあるデータを表します。

__NULL__ パーティションと __UNPARTITIONED__ パーティションを除き、パーティショニングする列のデータはすべてパーティション識別子の日付と一致します。これにより、フィルタ条件を満たすデータが含まれていないパーティションをクエリで判別できます。パーティショニング列のデータをフィルタリングするクエリでは、値を制限し、不要なパーティションを完全にプルーニングできます。

日付 / タイムスタンプ パーティショニングとシャーディング

日付 / タイムスタンプ パーティション分割テーブルの代わりに、[PREFIX]_YYYYMMDD のような時間ベースの命名方法を使用して、テーブルをシャード化することもできます。これを、日付別シャード化テーブルの作成と呼びます。標準 SQL またはレガシー SQL のいずれかを使用して、UNION 演算子を使用してクエリを指定し、クエリでスキャンされるテーブルを制限できます。

日付 / タイムスタンプ パーティション分割テーブルは、日付でシャード化されたテーブルよりもパフォーマンスが優れています。日付指定のテーブルを作成する場合、BigQuery では各日付指定テーブルのスキーマとメタデータのコピーを保持する必要があります。また、日付指定のテーブルを使用する場合は、クエリされた各テーブルの権限を確認するために BigQuery が必要となることがあります。このプラクティスはさらに、クエリのオーバーヘッドを増やし、クエリのパフォーマンスを低下させます。日付別テーブルではなく、日付 / タイムスタンプ パーティション分割テーブルを使用することをおすすめします。

パーティショニング オプションの比較

次の表は、シャード化されたテーブルと、日付 / タイムスタンプでパーティション分割テーブルを比較したものです。

能力 シャーディングしたテーブル 取り込み時間パーティション分割テーブル 分割テーブル
パーティショニング方法 なし: テーブルをシャーディングし、UNION 演算子を使用してクエリを実行すると、パーティショニングをシミュレートできます。 データの取り込み日または到着日に基づいてパーティション分割されます。パーティション情報は、疑似列を使用して参照できます。 指定した TIMESTAMP 列または DATE 列のデータを基準にしてパーティション分割されます。
パーティション識別子 なし 0001-01-01 から 9999-12-31 までの任意の有効日付を使用できますが、DML ステートメントでは 1970-01-01 より前、および 2159-12-31 より後の日付は参照できません。 バインドされた DATE 列または TIMESTAMP 列からの有効なエントリ。現在、1960-01-01 より前の日付値と 2159-12-31 より後の日付値は、共有の UNPARTITIONED パーティションに配置されます。NULL 値は、明示的な NULL パーティションにあります。
スキャンされるデータの制限 必要なシャードのみを参照し、クエリから不要な列を除外してデータを制限します。 パーティションをプルーニングするには、_PARTITIONTIME 疑似列を使用します。 パーティショニング列に述語フィルタを使用します。
パーティションの数 テーブル数に制限はありませんが、クエリでは最大 1,000 テーブルのみ参照できます。 最大 4,000 パーティション。 最大 4,000 パーティション。
更新オペレーション 1 日あたり 1,000 件の更新に制限されます。 個々のオペレーションを 1 つのパーティションに commit できます。最新のパーティション(デフォルト)、または [TABLE]$[DATE] などのパーティション デコレータを使用して指定されたパーティション。 個々のオペレーションで最大 2,000 個の異なるパーティションにデータを commit できます。
ストリーミング挿入 テーブルに対して 1 つのグローバル バッファ。 パーティションのサフィックスを使うと、現在の日付からの過去 31 日と将来の 16 日(UTC 時刻)のパーティションをストリーミングできます。 過去 1 年と将来の 6 か月のデータをストリーミングできます。この範囲外のデータは拒否されます。データがストリーミングされると、過去 7 日間と将来の 3 日間のデータがストリーミング バッファに置かれ、対応するパーティションに抽出されます。この時間枠外(ただし 1 年 6 か月の範囲内)のデータは UNPARTITIONED パーティションに配置されます。パーティション分割されていないデータが十分蓄積されると、対応するパーティションに読み込まれます。
タイムゾーン評価 ユーザー セマンティクスによる定義 UTC UTC

整数範囲パーティション分割テーブル

BigQuery では、開始、終了、間隔の値を選択して、特定の INTEGER 列を基準にしたパーティション分割テーブルを利用できます。整数範囲パーティション分割テーブルに対するクエリでは、パーティショニング列を基準にした述語フィルタを指定して、スキャンされるデータの量を減らすことができます。

整数範囲パーティション分割テーブルを作成する方法は次のとおりです。

  • 整数範囲パーティションを作成するために使用される列
  • 範囲パーティショニングの開始値(この値を含みます)
  • 範囲パーティショニングの終了値(この値を含みません)
  • パーティション内の各範囲の間隔

テーブルの範囲外の値は、「パーティション分割されていない」パーティションに入ります。

たとえば、次の値を持つ整数範囲パーティションを作成するとします。

引数
列名 customer_id
開始 0
終了 100
間隔 10

テーブルは、customer_id 列において、10 の間隔の範囲にパーティション分割されます。0 から 9 の値は 1 つのパーティションに入る、10 から 19 の値は別個のパーティションに入る、と続き、最後に 90 から 99 の値が別個のパーティションに入ります。0 から 99 以外の値(1 や 100 など)は、「パーティション分割されない」パーティションに入ります。Null 値は、NULL パーティションに入ります。

整数範囲パーティション分割テーブルを作成すると、次の 2 つの特殊パーティションが作成されます。

  • __NULL__ パーティション: パーティショニングする列で NULL 値が設定されている行を表します。
  • __UNPARTITIONED__ パーティション: 整数の開始と間隔の許容範囲外にあるデータを表します。

__NULL__ パーティションと __UNPARTITIONED__ パーティションを除き、パーティショニングする列のデータはすべて、整数の開始と間隔の範囲内になります。これにより、フィルタ条件を満たすデータが含まれていないパーティションをクエリで判別できます。パーティショニング列のデータをフィルタリングするクエリでは、値を制限し、不要なパーティションを完全にプルーニングできます。

開始値と終了値の間の可能な範囲の数の上限は、100,000 となります。ただし、データがある範囲の数は、各範囲が 1 つのパーティションであるため、テーブルあたり 4,000 パーティションに制限されます。

整数範囲パーティショニングとクラスタリング

整数範囲パーティショニングとクラスタリングのどちらでも、パフォーマンスが向上し、クエリ費用を抑えられます。両方には違いがあり、ユースケースが異なります。

次の場合は、整数範囲パーティショニングを使用します。

  • テーブルのパーティショニングに使用される範囲の明示的に定義します。データのパーティショニング方法と各パーティション内のデータを指定します。

  • クエリの実行前にクエリ費用を把握しておきます。パーティション プルーニングをクエリ実行の前に行い、ドライランでのパーティショニング プルーニングの後にクエリ費用を入手できます。クエリ実行中にクラスタ プルーニングを行うと、費用はクエリ終了後にのみ入手できます。

  • 特定のパーティションにデータを読み込む場合や、特定のパーティションのデータをワイプする場合など、パーティションを処理します。

次の場合はクラスタリングを使用します。

  • パフォーマンス向上や費用削減がなされる限り、どのようなデータのクラスタリング方法でもかまいません。BigQuery では、最適なパフォーマンスと費用のためのデータのクラスタリング方法を自動的に作成します。

  • 4,000 パーティション以上が必要です。BigQuery には、パーティション分割テーブルに 4,000 を上限としたパーティションがあります。テーブル内のクラスタの数に上限はありません。

同じ整数列上にパーティショニングとクラスタリングを行い、両方の利点を得ることができます。データはまず、指定の整数範囲に従ってパーティショニングされます。各範囲内において、データの量が十分な場合には、データはクラスタリングもされます。テーブルにクエリが実行されると、パーティショニングでは、パーティション プルーニングに基づきクエリ費用の上限が設定されます。クエリの実行時には、その他にもクエリ費用削減があります。

require_partitioning_filter の使用

整数範囲パーティショニングのリリースにより、現在 BigQuery では複数のパーティショニング タイプをサポートしています。

  • 取り込み時間
  • 日付 / タイムスタンプ
  • 整数の範囲

BigQuery API を簡略化するため、require_partitioning_filter パラメータをパーティショニング タイプレベルからテーブルレベルに移行しました。日付 / タイムスタンプ パーティショニングの下位互換性を保つため、パーティション レベルでの require_partitioning_filter のサポートを継続しています。テーブルレベルでの指定もできます。整数範囲パーティショニングについては、テーブルレベルでのみ require_partitioning_filter の指定ができます。bq コマンドライン ツールはすでにテーブルレベルのオプションを採用しているので、bq コマンドの使用方法に変更はありません。BigQuery API においては、テーブルレベルでの require_partitioning_filter オプションの使用が必要です。

パーティション分割テーブルの割り当てと制限

パーティション分割テーブルには BigQuery で制限が定義されています。

割り当てと制限は、パーティション分割テーブルに対して実行できる次のようなさまざまな種類のジョブにも適用されます。

すべての割り当てと制限の詳細については、割り当てと制限をご覧ください。

パーティション分割テーブルの料金

BigQuery でパーティション分割テーブルを作成して使用する場合、パーティションに格納されるデータの量とデータに対して実行するクエリに基づいて料金が発生します。

パーティションへのデータの読み込み、パーティションのコピー、パーティションからのデータのエクスポートなど、パーティション分割テーブルのオペレーションの多くは無料です。これらのオペレーションは無料ですが、BigQuery の割り当てと制限が適用されます。すべての無料オペレーションについては、料金ページの無料のオペレーションをご覧ください。

次のステップ