REPLACE WHEREとマテリアライズドビューをいつ使用するか
REPLACE WHERE フローとスタンドアロン マテリアライズドビューはどちらも、ソースデータの変更に合わせて最新状態に保たれる派生テーブルを維持できますが、それぞれ異なる問題を解決します。時間ウィンドウまたはパーティションを定期的に上書きするほとんどのバッチ抽出、変換、読み込み(ETL)ワークロードには、増分 REPLACE WHERE フローを使用します。ダッシュボードやレポートに事前計算済みの結果を提供するクエリー高速化レイヤーには、マテリアライズドビューを使用します。
このページでは、スタンドアロンのストリーミングテーブルとマテリアライズドビューについて説明します。LakeFlow Pipelines の REPLACE WHERE フローについては、「REPLACE WHERE フローによるバッチ処理」を参照してください。
バッチ上書きに REPLACE WHERE を使用する
REPLACE WHERE フローは、時間枠やパーティションなど、述語に一致する行のみを再計算して上書きします。他のすべての行はそのまま残ります。フローはその述語範囲のソースクエリーのみを再評価するため、各更新のコストはテーブルのサイズではなく、範囲のサイズに依存します。
マテリアライズドビューは、その定義クエリーの完全な結果を保持します。クエリーとソースデータがサポートしている場合、Databricksはマテリアライズドビューをインクリメンタルに更新し、それ以外の場合は完全更新を実行します。更新が増分かどうかはクエリー構造とソーステーブルに依存するため、各更新のコストを予測するのは困難です。スタンドアロンのマテリアライズドビューはどのように更新されますか?を参照してください。
境界範囲内で変更されるバッチETLデータモデルの場合、REPLACE WHEREフローを使用すると、各更新で書き換える行を正確に制御できます。マテリアライズドビューは、ユーザーが事前計算された結果に高速にアクセスする必要がある場合に適しています。
コンストラクトをメダリオンレイヤーにマップする
次の表は、 メダリオンアーキテクチャの各レイヤーをDatabricksが推奨する構成にマッピングしたものです。
レイヤー | 構築 | 理由 |
|---|---|---|
ブロンズ(生データの取り込み) | Lakeflow ConnectまたはAuto Loaderを使用したインジェスト | 履歴を再処理することなく、未処理レコードを到着時に増分的に保存します。 |
シルバー(事実) | ファクトの更新、遅れて到着したデータ、修正のために影響を受ける時間枠またはパーティションのみを上書きします。 | |
シルバー(ディメンション) | 挿入、更新、および削除のセマンティクスを自動的に適用し、slowly changing dimensions(SCD)タイプ1またはタイプ2で履歴を保持します。 | |
ゴールド(集計とデータモデル) | 集計とモデルの述語範囲のみを再計算し、テーブル全体の再計算を回避します。 | |
クエリーの高速化とサービング | ダッシュボードやレポートに事前計算された結果を提供し、クエリー結果を最新の状態に保ちます。 |
意思決定ガイド
次のガイドを使用して、2 つの構成要素から選択してください。
REPLACE WHEREフローは、次の場合に使用します。
- 時間枠またはパーティションの定期的なバッチ上書きをランします。
- 遅れて到着したデータを修正します。
- 境界のある範囲にコンプライアンス削除を適用します。
- パーティションレベルでデータを更新します。
マテリアライズドビューは、次の場合に使用してください。
- ダッシュボードのクエリーを高速化します。
- 事前計算された集計をリーダーに提供します。
- サービング レイヤーのクエリー結果を最新の状態に保ちます。
例:REPLACE WHEREを使用した増分上書き
次の例では、更新のたびに過去7日間のデータのみを上書きするターゲットテーブルを定義しています。更新中に、フローは述語と一致する行を削除し、その同じ範囲のソースクエリーを再計算し、結果を挿入します。ウィンドウ外の行は変更されません。
CREATE OR REFRESH STREAMING TABLE payments_latest
FLOW REPLACE WHERE payment_date >= date_add(current_date(), -7) BY NAME
SELECT payment_id, booking_id, status, payment_date
FROM samples.wanderbricks.payments;
BY NAME は、列が位置ではなく名前で一致するようにするために必要です。完全な構文、述語オーバーライド、バックフィル、および増分更新の動作については、 スタンドアロンストリーミングテーブルのREPLACE WHEREフローを参照してください。