本文へ移動

ホーム / Data / 第4部 データ基盤

第4部 データ基盤・第9章

クラウド DWH

★★☆ 重要6トピック・面接 3問

クラウド DWH の仕組みと、速さ・コストの勘所を押さえる。

別のページで開く →

DBラボを読み込んでいます…

ひとことで

保存と計算が分かれていて、読むデータ量や計算時間で課金される。

BigQuery・Snowflake・Redshift などのクラウド DWH は、保存(ストレージ)と計算(コンピュート)が分かれているのが特徴です。保存はオブジェクトストレージ並みに安く、計算は必要なときに必要なだけ使います。料金は製品によって考え方が違います。

保存は1か所、計算は用途ごとに必要なだけ取り込み・変換用夜間に大きくBI 用昼間だけ分析者用使うときだけストレージ(安い・共有)テーブルのデータ。パーティション・クラスタリングで並べて保存料金:計算は「読んだ量」か「動かした時間」、保存は「置いた量」で決まる
クラウド DWH の保存と計算の分離
課金の考え方例節約の要
読んだデータ量BigQuery のオンデマンド読む列とパーティションを減らす
計算資源を動かした時間Snowflake の仮想ウェアハウス、BigQuery の予約(スロット)使わない時間は止める(自動停止)・大きさを用途に合わせる
クラスタの台数×時間Redshift のプロビジョンド台数と稼働時間の見直し

大きなデータでの SQL の書き方

面接ではこう答える

BigQuery や Snowflake などのクラウド DWH は、保存と計算が分かれているのが特徴で、保存はオブジェクトストレージ並みに安く、計算は必要なときに必要なだけ使います。料金の考え方は製品で違い、BigQuery のオンデマンドは読んだデータ量、Snowflake は仮想ウェアハウスを動かした時間で課金されます。どちらの課金でも、読む量を減らし、使わない計算資源を止めることが節約の基本です。

別のページで開く →

DBラボを読み込んでいます…

DWH の費用は、気づくと大きく増えていることがあります。調べるときは、ジョブの履歴(BigQuery の INFORMATION_SCHEMA.JOBS、Snowflake の ACCOUNT_USAGE のクエリ履歴など)から、読んだ量や実行時間の大きいものを順に並べます。

コストが増えたときの調べ方請求の内訳いつから・どこが保存か計算かジョブの履歴読んだ量・時間INFORMATION_SCHEMA など上位のクエリ誰の・何の同じ集計の繰り返し?直す持ち主と相談増分・集計テーブル
多くの場合、少数のクエリやジョブが費用の大半を占める

よく効く節約:

  • SELECT * をやめ、実行前に読む量を確認する。
  • 大きなテーブルは日付でパーティションを切り、よく絞る列でクラスタリングする。パーティションの条件を必須にしておく。
  • 全件の作り直しをやめて増分処理にする。ダッシュボードが同じ重い集計を何度も流しているなら、集計テーブルやマテリアライズドビューにする。
  • ユーザーやジョブごとに上限(1クエリの最大の読み込み量、予算のアラート)を設定する。
  • 使われていないテーブル・古いパーティションに有効期限をつける。

パーティションを細かくしすぎる(1つあたりのデータがとても少ない)と、かえって管理の負担が増えます。日単位で小さすぎるなら月単位にし、その中をクラスタリングで絞るのが目安です。

費用を下げる工夫は、利用者の使い方を変えることも多いので、どのダッシュボード・どの人のクエリかまで特定して、持ち主と一緒に直します。

ひとことで

パーティションは日付などの粗い区切りで丸ごと読み飛ばし、クラスタリングはよく絞る列で並べて中の塊を読み飛ばす。

パーティションとクラスタリングパーティション日付など1つの粗い区切り区切りごとに丸ごと読み飛ばす期限切れ・入れ替えの単位にもなるクラスタリングよく絞る列で並べて保存中の塊を読み飛ばす数列まで。種類の多い列でも使える
パーティションで粗く区切り、その中をクラスタリングで絞る
列の例向くのは理由
注文日・イベントの日付パーティションほとんどのクエリが期間で絞る。古い区切りを消せる
user_id・shop_idクラスタリング種類が多すぎて区切りにできない
国・状態クラスタリング種類が少なく、日付と一緒に絞る

パーティションには製品ごとの数の上限があり、細かくしすぎると1つあたりのデータが小さくなって効率が落ちます。データが少ないテーブルは、日ではなく月で区切るか、区切らずにクラスタリングだけにします。BigQuery ではパーティションの条件を必須にする設定ができ、条件のない全件の読み込みを防げます。

面接ではこう答える

パーティションはテーブルを日付などの1つの粗い区切りに分け、条件に合わない区切りを丸ごと読み飛ばします。古い区切りの削除や作り直しの単位にもなります。クラスタリングは、その中をよく絞る列で並べて保存し、読む塊を減らします。種類の多い user_id のような列はパーティションにはできないので、クラスタリングに使います。

多くのダッシュボードが、同じ大きなテーブルを毎回同じように集計していると、費用も待ち時間も無駄になります。集計の結果を保存して使い回します。

同じ重い集計を、1回だけ計算して使い回す大きなファクト数十億行1日1回だけ読む集計テーブル日×店×商品増分で更新ダッシュボード何十枚が読む小さく速い
毎回ファクトを集計する代わりに、集計済みのテーブルを読む
方法更新向くもの
集計テーブル(dbt のモデル)自分で決めた時刻に作り直す・増分で足す定義を管理したい指標。いちばん分かりやすい
マテリアライズドビューDWH が自動で更新する(製品ごとに書ける SQL に制限がある)単純な集計を、元の変更に合わせて最新にしたい
BI ツールのキャッシュ・抽出BI ツールが取り込む1つのダッシュボードの中だけで使う

集計テーブルの粒度は、よく使う切り口の組み合わせに合わせます。率は分子と分母を別に持たせ、あとでまとめ直せるようにします(足せる指標・足せない指標)。

ひとことで

取り込み・変換・BI・分析など性格の違う使い方に、別々の計算資源を割り当てて、互いに待たせないようにする。

同じ DWH を、取り込み・夜間の変換・BI・アナリストの探索など、性格の違う使い方が同時に使います。1つの計算資源を共有すると、重いバッチの間はダッシュボードが待たされます。

用途ごとに計算資源を分ける1つを共有夜のバッチが重いと朝の BI が遅い誰が使ったか分かりにくい大きさを決めにくい用途ごとに分ける取り込み・変換・BI・分析で別々互いに待たされない用途ごとに費用が分かる
Snowflake の仮想ウェアハウス、BigQuery の予約の割り当てなどで分ける
用途性格計算資源の考え方
夜間の変換重いが時間に余裕がある大きめにして早く終わらせ、終わったら止める
BI・ダッシュボード軽いが同時に多い・待たせたくない同時実行に強い設定、結果のキャッシュ
アナリストの探索読みが予測できない1クエリの上限や予算のアラートを付ける

面接ではこう答える

DWH は性格の違う使い方が同時に使うので、1つの計算資源を共有すると、夜間の重いバッチの間にダッシュボードが待たされます。Snowflake なら用途ごとに仮想ウェアハウスを分け、BigQuery なら予約の割り当てを分けて、互いの影響をなくします。用途ごとに費用も分かるようになり、上限やアラートも用途に合わせて付けられます。

同じ SQL でも、どのエンジンで動かすかは、データの大きさ・置き場所・使う人で選びます。

エンジン向くもの注意
クラウド DWH表のデータの変換と分析。運用の手間が少ない料金の仕組みを理解して使う
Spark大量のファイルの処理、Python での複雑な変換、ML の前処理クラスタの設定と運用が要る
Trino などの分散 SQLレイクのテーブルや複数の DB を SQL でまとめて読む書き込みや長いバッチは得意でない
DuckDB手元や1台のマシンで、数 GB〜数十 GB の Parquet を速く分析1台に収まる大きさまで

「大きいデータだから Spark」と決めつけず、DWH の SQL で済むならそれが一番運用が楽です。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 保存と計算の分離と、課金の仕組み
  • パーティション・クラスタリング・集計テーブル
  • コストの調べ方とワークロードの分離

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1クラウド DWH のコストが急に増えたらどう調べますか?

模範回答

まず請求やコストの画面で、いつから・どのプロジェクトやウェアハウスで増えたかを確かめます。次にクエリの履歴(BigQuery なら INFORMATION_SCHEMA.JOBS、Snowflake なら QUERY_HISTORY)から、読んだ量や実行時間の多い順に、ユーザー・ジョブ・クエリの形でまとめ、増えた時期に現れたものを探します。

よくある犯人は、パーティションの条件が抜けた新しいクエリ、SELECT * のダッシュボードが短い間隔で自動更新されているもの、増分だったはずの処理が全件の作り直しになったもの、バックフィルの流しすぎです。犯人が分かったら持ち主と直し、そのうえで再発防止として、パーティション条件の必須化、1クエリの上限、予算のアラート、ウェアハウスの自動停止を入れます。

深掘りされたら

  • ダッシュボードのクエリが原因だったら、どう直しますか?

見られているポイントクエリごとのスキャン量・犯人のクエリ・対策

Q2パーティションとクラスタリングは、どう使い分けますか?

模範回答

パーティションはテーブルを日付などの1つの列で大きく区切る仕組みで、条件に合わない区切りは丸ごと読まずに済みます。クラスタリングは、その区切りの中をよく絞り込む列で並べて保存する仕組みで、絞り込むと読むブロックが減ります。

目安として、ほとんどのクエリが期間で絞るなら日付でパーティションを切り、そのうえで user_id や国など WHERE によく出る列を数個クラスタリングにします。パーティションを細かくしすぎると、1つあたりが小さくなって管理の負担が増えるので、データが少ないなら月単位にして、残りはクラスタリングで絞ります。大きなテーブルでは、パーティションの条件を必須にする設定も入れます。

深掘りされたら

  • ユーザー ID でパーティションを切らないのはなぜですか?

見られているポイント2つの仕組みの違いと、選び方の目安

Q3朝の時間だけダッシュボードが遅くなります。何を疑いますか?

模範回答

まず、朝に何が同時に動いているかを見ます。よくあるのは、夜間の変換のバッチが朝までずれ込み、ダッシュボードと同じ計算資源を取り合っていることです。ジョブの履歴で、遅い時間帯のクエリの待ち時間と、同時に動いていたジョブを確かめます。

対策は、変換と BI で計算資源を分けること、バッチを早く終わらせること(増分処理・大きめの資源で短時間)、ダッシュボードが毎回大きなファクトを集計しているなら集計テーブルにすることです。朝に全員が開くなら、その前に集計を終わらせて結果のキャッシュを効かせます。

深掘りされたら

  • 計算資源を分けると費用は増えませんか?

見られているポイント時間帯と同時実行から原因を絞れるか