【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
メリット
- コスト削減: クエリ時に必要なパーティションのみをスキャンするため、フルスキャンを避け、課金額を抑えられます。
- パフォーマンス向上: 読み込むデータ量が減るため、クエリの実行速度が上がります。
- 管理の容易化: 特定の期間のデータ削除などが効率的に行えます。
主な種類
- 時間単位列パーティショニング:
DATE、DATETIME、TIMESTAMP列に基づいて分割(日、時間、月、年単位)。 - 取り込み時間パーティショニング: データがロードされた時間(
_PARTITIONTIME)に基づいて自動的に分割。 - 整数範囲パーティショニング:
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のパフォーマンスを最大限に引き出し、運用コストを最小限に抑えることができます。