模擬問題集 › GCP-PDE › 練習問題 8

GCP-PDE 練習問題 8|データの保存

Professional Data Engineer・無料公開(全 200 問中 15 問を無料公開中)

問題
大量のクリックストリーム イベントデータを格納する BigQuery テーブルを設計しています。データ アナリスト チームは、特定のイベント日付の範囲でクエリを実行し、ユーザー ID(UUID)でフィルタすることが最も多くなります。クエリの費用とパフォーマンスのためにテーブル構造を最適化したいと考えています。どうすればよいですか?

選択肢と解説

  • 1
    ユーザー ID 列でテーブルをパーティション分割し、イベント日付列でテーブルをクラスタ化する。
  • 2
    取り込み時間パーティション分割テーブルを作成し、ユーザー ID 列でクラスタ化する。
  • 3
    イベント日付列とユーザー ID 列の両方でテーブルをクラスタ化する。
  • ✓
    イベント日付列でテーブルをパーティション分割し、ユーザー ID 列でテーブルをクラスタ化する。

解説

【正解】D

【0からの解説】
①前提知識
・パーティション分割:テーブルを日付・時刻列などでセグメント(パーティション)に分け、WHERE 句で絞り込んだパーティションだけを読み取る仕組みです(パーティション プルーニング)。オンデマンド料金はスキャンしたバイト数に課金されるため、読み取るパーティションが減れば費用が直接下がり、クエリ実行前に処理バイト数を正確に見積もることもできます。パーティション分割に使えるのは、時間単位列(DATE / TIMESTAMP / DATETIME)、取り込み時間、整数範囲(INTEGER)の 3 種類だけです。
・クラスタリング:指定した列(最大 4 列)の値でテーブル内(パーティション内)のデータを並べ替えて格納し、その列でフィルタしたときに不要なブロックを読み飛ばす仕組みです。値の種類が非常に多い(カーディナリティが高い)列に向いています。

②問題文の要件の整理
・最も多いクエリ:イベント日付の範囲での絞り込み + ユーザー ID(UUID)でのフィルタ
・目的:クエリの費用とパフォーマンスの最適化

③正解の理由
日付範囲の絞り込みはイベント日付列のパーティション分割で粗く(確実に)行い、各パーティションの中をユーザー ID でクラスタ化して細かく絞り込む、というのが BigQuery の定石です。「時間軸はパーティション、高カーディナリティ列はクラスタ」と覚えておきましょう。パーティションとクラスタを組み合わせることで、日付範囲外のパーティションはまったく読まず、範囲内でも該当ユーザーのブロックだけを読むため、費用と性能の両方が最適化されます。

【誤りの選択肢】
A:UUID は STRING 型で値の種類が膨大です。BigQuery のパーティション分割は時間単位列・取り込み時間・整数範囲にしか対応しておらず、UUID 列ではパーティション分割できません(仮にできたとしても、パーティション数の上限をすぐに超えます)。また、最も多い条件である日付範囲をクラスタ列にすると、パーティションのような確実なスキャン範囲の限定ができません。
B:取り込み時間パーティションは「BigQuery にデータが取り込まれた時刻」で分割されます。アナリストが絞り込むのはイベントの発生日付であり、遅延到着やバックフィルで取り込み日時とイベント日付がずれると、イベント日付の範囲でパーティション プルーニングが効きません。
C:クラスタリングだけでもブロックの読み飛ばしで性能は改善しますが、パーティション分割のような確実なスキャン範囲の限定やクエリ前の正確な費用見積もりができません。日付範囲で頻繁に絞り込む本ケースでは、日付でパーティション分割する D の方が費用削減効果が大きく、パーティション単位の有効期限設定などの管理もしやすくなります。

【参考】
パーティション分割テーブルの概要
クラスタ化テーブルの概要
← 練習問題 7練習問題 9 →
GCP-PDE の模擬問題集は全 200 問

本番形式の練習テスト 4 回を、試験モード/演習モードで受験できます。 全問に解説付き、ドメイン別の弱点分析にも対応。模試プラン(月額 ¥980)からご利用いただけます。

GCP-PDE の模試を受ける料金プランを見る

GCP-PDE の無料公開問題

問題 1問題 2問題 3問題 4問題 5問題 6問題 7問題 8問題 9問題 10問題 11問題 12問題 13問題 14問題 15