【google cloud】パーティショニングとクラスタリング


BigQueryのパーティショニングとクラスタリング

BigQueryで大量のデータを効率よく、かつ安価に扱うためには「パーティショニング」と「クラスタリング」の理解が不可欠です。


1. パーティショニング(Partitioning)とは

パーティショニングは、大きなテーブルを特定の列の値に基づいて「物理的な小さな塊(パーティション)」に分割する機能です。

graph TD
    subgraph "大きなテーブル (全データ)"
        T[非パーティションテーブル]
    end
    T -- 分割 --> P1[1月1日のデータ]
    T -- 分割 --> P2[1月2日のデータ]
    T -- 分割 --> P3[1月3日のデータ]
    
    style T fill:#f9f,stroke:#333,stroke-width:2px
    style P1 fill:#bbf,stroke:#333
    style P2 fill:#bbf,stroke:#333
    style P3 fill:#bbf,stroke:#333

メリット

  • コスト削減: クエリ時に必要なパーティションのみをスキャンするため、フルスキャンを避け、課金額を抑えられます。
  • パフォーマンス向上: 読み込むデータ量が減るため、クエリの実行速度が上がります。
  • 管理の容易化: 特定の期間のデータ削除などが効率的に行えます。

主な種類

  1. 時間単位列パーティショニング: DATEDATETIMETIMESTAMP 列に基づいて分割(日、時間、月、年単位)。
  2. 取り込み時間パーティショニング: データがロードされた時間(_PARTITIONTIME)に基づいて自動的に分割。
  3. 整数範囲パーティショニング: INTEGER 列の数値範囲に基づいて分割。

2. クラスタリング(Clustering)とは

クラスタリングは、パーティション(またはテーブル全体)内のデータを、特定の列の値に基づいて「並べ替えて配置」する機能です。

graph LR
    subgraph "パーティション内のデータ配置"
        direction TB
        B1[ブロック1: ID 100〜199]
        B2[ブロック2: ID 200〜299]
        B3[ブロック3: ID 300〜399]
    end
    
    Query{WHERE ID = 250} -->|必要なブロックのみ特定| B2
    
    style B1 fill:#fff,stroke:#333
    style B2 fill:#dfd,stroke:#333,stroke-width:4px
    style B3 fill:#fff,stroke:#333

メリット

  • フィルタリングの高速化: WHERE 句で指定した列がクラスタ化されている場合、該当するデータの場所を特定しやすくなります。
  • 集計の効率化: 同じ値が近くに配置されるため、GROUP BY などの処理が高速になります。
  • さらなるコスト削減: パーティショニングと組み合わせることで、スキャン範囲をさらに絞り込めます。

3. パーティショニング vs クラスタリング:使い分けのポイント

graph TD
    subgraph "最強の組み合わせ"
        direction TB
        P[1. パーティショニング
日付などで大きく分ける] P --> C[2. クラスタリング
その中でさらによく使う列で並べる] end
特徴パーティショニングクラスタリング
仕組み物理的な分割データの並べ替え
主な用途日付や時間の管理、大きな粒度での分割頻繁に検索条件(フィルタ)に使う列の最適化
制限パーティション数に上限がある(最大4,000程度)上限はない
料金クエリコストが明確に減るスキャン範囲が絞られた分だけ減る

どちらを使うべき?

  • 基本は「両方の組み合わせ」:
    • まず、日付などの時間軸でパーティショニングを行い(例:event_date)、
    • その中でよく検索条件に使うIDやカテゴリなどでクラスタリングを行う(例:user_id, category)のがベストプラクティスです。
  • カーディナリティ(値の種類)が高い場合:
    • 値の種類が非常に多い列(例:ユーザーIDなど)を分割したい場合は、パーティショニングの上限に達してしまうため、クラスタリングが適しています。

まとめ

  • パーティショニングは「大きな引き出しを小さな段に分ける」イメージ。
  • クラスタリングは「引き出しの中身をアイウエオ順に並べる」イメージ。

これらを適切に設定することで、BigQueryのパフォーマンスを最大限に引き出し、運用コストを最小限に抑えることができます。


参照元: BigQuery パーティション分割テーブルの概要 | Google Cloud