分割テーブルの概要

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

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

BigQuery には 2 つのタイプのテーブル分割があります。

  • 取り込み時間で分割されたテーブル: データの取り込み(読み込む)日付または到着日に基づいて分割されたテーブル。
  • 分割テーブル: TIMESTAMP 列または DATE 列に基づいて分割されたテーブル。

取り込み時間分割テーブル

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

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

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

分割テーブル

BigQuery では、分割テーブルも使用できます。分割テーブルを使用すると、パーティショニング スキームを特定の TIMESTAMP 列や DATE 列にバインドできます。分割テーブルに書き込まれたデータは、分割する列の日付値(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 テーブルのみ参照できます。 最大 2,500 パーティション。 最大 2,500 パーティション。
更新オペレーション 1 日あたり 1,000 件の更新に制限されます。 個々のオペレーションを 1 つのパーティションに commit できます。最新のパーティション(デフォルト)、または [TABLE]$[DATE] などのパーティション デコレータを使用して指定されたパーティション。 個々のオペレーションで最大 2,000 個の異なるパーティションにデータを commit できます。
ストリーミング インサート テーブルに対して 1 つのグローバル バッファ。 パーティション サフィックスを使用して、最大 30 の日付ベースのパーティションを対象にすることができます。 パーティショニング値が過去 7 日以内、将来 3 日以内、または NULL 場合、ストリーミング データが受け入れられます。
タイムゾーン評価 ユーザー セマンティクスによる定義 UTC UTC

分割テーブルの割り当てと制限

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

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

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

分割テーブルの料金

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

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

次のステップ

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

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