SELECTクエリは高速かつ軽量になります。インクリメンタルビューはすべてのaggregation関数をサポートし、各クエリが挿入されるdatasetのうち小さく直近のsubsetだけを対象に実行されるため、PB規模のデータにも適切にスケールします。
リフレッシュ可能なマテリアライズドビューは、これとは対照的に、スケジュールに基づいて更新されます。これらのビューは定期的にクエリ全体を再実行し、その結果でターゲットテーブルを上書きします。これは、Postgresのような従来のOLTPデータベースにおけるmaterialized viewに似ています。
インクリメンタルmaterialized viewとリフレッシュ可能なマテリアライズドビューのどちらを選ぶかは、主にクエリの性質、データがどの程度の頻度で変化するか、さらにビューの更新で各行の挿入をその都度反映する必要があるのか、それとも定期的なrefreshで十分なのかによって決まります。こうしたトレードオフを理解することは、ClickHouseで高性能かつスケーラブルなmaterialized viewを設計するうえで重要です。
インクリメンタルmaterialized viewを使用する場合
- insert のたびに更新されるリアルタイムのクエリ結果が必要な場合。
- 大量のデータに対して、集計やフィルタリングを頻繁に行う場合。
- クエリに、単一テーブルに対する単純な変換または集計が含まれる場合。
リフレッシュ可能なマテリアライズドビューを使用するタイミング
まとめ
- キャッシュされたクエリ結果をすぐに利用できる必要があり、鮮度のわずかな遅れは許容できる場合。
- クエリの結果セットについて上位 N 件が必要な場合。
- 結果セットのサイズが時間の経過とともに際限なく増加しない場合。際限なく増加すると、ターゲットビューのパフォーマンスは低下します。
- 複数のテーブルにまたがる複雑な JOIN や非正規化を行っており、いずれかのソーステーブルが変更されるたびに更新が必要な場合。
- バッチワークフローや非正規化タスクを構築する場合、または DBT の DAG に似たビュー依存関係を作成する場合。
APPEND と REPLACE モード
APPEND と REPLACE の2つのモードをサポートしています。これらのモードは、ビューのクエリ結果をリフレッシュ時にどのように書き込むかを定義します。
REPLACE はデフォルトの動作です。ビューがリフレッシュされるたびに、ターゲットテーブルの既存の内容は最新のクエリ結果で完全に上書きされます。これは、結果セットのキャッシュのように、ビューが常に最新の状態を反映している必要があるユースケースに適しています。
一方、APPEND では、内容を置き換えるのではなく、新しい行をターゲットテーブルの末尾に追加できます。これにより、定期的なスナップショットの取得など、より幅広いユースケースに対応できます。APPEND は、各リフレッシュがそれぞれ特定時点の状態を表す場合や、結果を履歴として蓄積したい場合に特に有用です。
次のような場合は APPEND モードを選択してください。
- 過去のリフレッシュ履歴を保持したい。
- 定期的なスナップショットやレポートを作成している。
- リフレッシュ結果を時間の経過とともに段階的に収集する必要がある。
REPLACE モードを選択してください。
- 必要なのが最新の結果だけである。
- 古いデータは完全に破棄すべきである。
- ビューが現在の状態またはルックアップを表している。
APPEND 機能の活用例を確認できます。