Professional Data Engineer(Google Cloud) 無料問題 7 / 10 ・ 分野3: データの保存
BigQuery のテーブル sales は、日付の列 sale_date で日ごとに分割し、customer_id でクラスタ化している。ブロックは B1(2026-03-10・customer_id 300〜499)・B2(2026-03-10・500〜799)・B3(2026-03-11・400〜599)・B4(2026-03-10・700〜999)の4つである。WHERE customer_id BETWEEN 450 AND 650 AND sale_date = '2026-03-10' のクエリについて、Introduction to clustered tables のページの説明に合うものはどれか。
- B1 と B2 を走査し、処理したバイト数は、3月10日のパーティションのうち走査した B1 と B2 の、参照する列のバイト数の合計になる
- B1 と B2 を走査し、処理したバイト数は 3月10日のパーティションの全ブロック(B1・B2・B4)の、参照する列のバイト数の合計になる
- B1・B2・B4 を走査し、ブロックの刈り込みに使うのは、パーティションの列の日付の条件のほうである
- B1・B2・B3 を走査し、B3 は customer_id の範囲が条件と重なるので、別の日のパーティションでも読まれる
正解と解説を見る
正解: A
正解の理由
Block pruning の節は、クラスタ化したテーブルへのクエリがクラスタの列に条件を持つと、BigQuery は条件の式とブロックのメタデータを使って、走査するブロックを刈り込むと書く。刈り込まれたブロックは走査されず、処理したバイト数は、走査したブロックの中の、クエリが参照する列のバイト数の合計になる。B3 は3月11日のパーティションなので日付の条件で除かれ、3月10日の B1(300〜499)と B2(500〜799)は 450〜650 と重なるので走査し、B4(700〜999)は重ならないので刈り込まれる。
違う選択肢
「B1 と B2 を走査し、処理したバイト数は 3月10日のパーティションの全ブロック(B1・B2・B4)の、参照する列のバイト数の合計になる」… ページは、刈り込まれたブロックは走査されず、処理したバイト数の計算には走査したブロックだけを使うと書く。刈り込まれた B4 のバイト数は、同じ日のパーティションにあっても数えない。
「B1・B2・B4 を走査し、ブロックの刈り込みに使うのは、パーティションの列の日付の条件のほうである」… ページは、クエリがクラスタの列に条件を持つと、BigQuery はその条件の式とブロックのメタデータで、走査するブロックを刈り込むと書く。customer_id の条件で、値の範囲が重ならない B4 は走査されない。
「B1・B2・B3 を走査し、B3 は customer_id の範囲が条件と重なるので、別の日のパーティションでも読まれる」… ページの例は、パーティションの列の日付の条件で、ほかの日のブロック(B3)を刈り込むと示す。クラスタの列の範囲が条件と重なっていても、別の日のパーティションにあるブロックは読まれない。
費用の見え方
ページは、1つのクエリの中でクラスタ化したテーブルを複数の条件で何度も参照するときは、それぞれの条件に当たるブロックの列の走査に課金されると書く。ブロックの刈り込みで読まない部分を減らすことが、クラスタリングで費用を下げるしくみである。
Professional Data Engineer(Google Cloud)の演習アプリ(無料10問・全問は解錠で)へ