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

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

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

BigQuery のテーブルのパーティショニングには、次の 2 種類があります。

  • 取り込み時間パーティション分割テーブル: データを取り込んだ(読み込んだ)日付またはデータが着信した日付に基づいてパーティション分割されたテーブル。
  • 日付 / 時間パーティション分割テーブル: TIMESTAMP 列または DATE 列を基準にしてパーティション分割されたテーブル。

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

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

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

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

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

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

日付 / タイムスタンプ パーティション分割テーブルに、_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 で制限が定義されています。

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

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

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

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

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。