メインコンテンツまでスキップ
メインコンテンツまでスキップ

カスケーディングマテリアライズドビュー

この例では、マテリアライズドビューを作成し、次に、最初のマテリアライズドビューにカスケードする2番目のマテリアライズドビューを作成する方法を示します。このページでは、その方法、さまざまな可能性、および制限について説明します。さまざまなユースケースは、2番目のマテリアライズドビューをソースとして使用して、マテリアライズドビューを作成することで対応できます。


例:

ドメイン名のグループに対する1時間ごとのビュー数を持つ架空のデータセットを使用します。

私たちの目標

  1. 各ドメイン名ごとに月ごとに集約されたデータが必要です。
  2. 各ドメイン名ごとに年ごとに集約されたデータが必要です。

これらのオプションのいずれかを選ぶことができます:

  • SELECTリクエスト中にデータを読み取って集約するクエリを書く
  • データを新しい形式で取り込む時点で準備する
  • 特定の集約に対してデータを取り込む時点で準備する。

マテリアライズドビューを使用してデータを準備することで、ClickHouseが実行する必要のあるデータと計算の量を制限でき、SELECTリクエストが高速化されます。

マテリアライズドビューのソーステーブル

データを集約したものを報告することが目標であるため、個々の行ではなくソーステーブルを作成します。これにより、情報をマテリアライズドビューに渡し、実際の入力データを破棄することができます。これにより目標が達成され、ストレージの節約にもなりますので、Nullテーブルエンジンを使用します。

注記

Nullテーブルにマテリアライズドビューを作成できます。したがって、テーブルに書き込まれたデータはビューに影響しますが、元の生データは依然として破棄されます。

月単位の集約テーブルとマテリアライズドビュー

最初のマテリアライズドビューのために、Targetテーブルを作成する必要があります。この例では、analytics.monthly_aggregated_dataとし、月単位およびドメイン名ごとにビューの合計を保存します。

ターゲットテーブルにデータを転送するマテリアライズドビューは次のようになります:

年単位の集約テーブルとマテリアライズドビュー

次に、前のターゲットテーブルmonthly_aggregated_dataにリンクされた2番目のマテリアライズドビューを作成します。

まず、各ドメイン名ごとに年単位で集約されたビューの合計を保存する新しいターゲットテーブルを作成します。

このステップでカスケードが定義されます。FROMステートメントはmonthly_aggregated_dataテーブルを使用します。これはデータのフローが次のようになることを意味します:

  1. データがhourly_dataテーブルに送られます。
  2. ClickHouseは受信したデータを最初のマテリアライズドビューmonthly_aggregated_dataテーブルに転送します。
  3. 最後に、ステップ2で受信したデータがyear_aggregated_dataに転送されます。
注記

マテリアライズドビューを操作する際の一般的な誤解は、データがテーブルから読み取られるというものです。マテリアライズドビューは、挿入されたブロックのデータを転送するものであり、テーブル内の最終結果ではありません。

この例でmonthly_aggregated_dataに使用されるエンジンがCollapsingMergeTreeであると仮定すると、私たちの2番目のマテリアライズドビューyear_aggregated_data_mvに転送されるデータは、圧縮されたテーブルの最終結果ではなく、むしろSELECT ... GROUP BYで定義されたフィールドを持つデータのブロックが転送されます。

CollapsingMergeTree、ReplacingMergeTree、またはSummingMergeTreeを使用している場合で、カスケードマテリアライズドビューを作成する予定がある場合は、ここで説明されている制限を理解する必要があります。

サンプルデータ

今、データを挿入してカスケードマテリアライズドビューをテストする時が来ました:

analytics.hourly_dataの内容をSELECTすると、テーブルエンジンがNullであるため、次のように表示されますが、データは処理されました。

小さなデータセットを使用しているため、結果を追跡し、期待されるものと比較できます。フローが小さなデータセットで正常であれば、大規模なデータに移動できます。

結果

ターゲットテーブルでsumCountViewsフィールドを選択してクエリを実行すると、バイナリ表現が表示されます(いくつかの端末では)。値が数としてではなく、AggregateFunction型として保存されているためです。集約の最終結果を取得するには、-Mergeサフィックスを使用する必要があります。

このクエリでAggregateFunctionに保存されている特殊文字を確認できます:

代わりに、Mergeサフィックスを使用してsumCountViewsの値を取得してみます:

AggregatingMergeTreeではAggregateFunctionsumとして定義しましたので、sumMergeを使用できます。AggregateFunctionavgを使用するときは、avgMergeを使用します。

これで、マテリアライズドビューが定義した目標にきちんと応じていることが確認できます。

ターゲットテーブルmonthly_aggregated_dataにデータが保存されたので、各ドメイン名ごとに月単位で集約されたデータを取得できます:

年単位で各ドメイン名ごとに集約されたデータ:

複数のソーステーブルを単一のターゲットテーブルに結合する

マテリアライズドビューは、複数のソーステーブルを同じ宛先テーブルに結合するためにも使用できます。これは、UNION ALLロジックに似たマテリアライズドビューを作成するのに役立ちます。

まず、異なるメトリックセットを表す2つのソーステーブルを作成します:

次に、メトリックの結合セットを持つTargetテーブルを作成します:

同じTargetテーブルを指す2つのマテリアライズドビューを作成します。欠落している列を明示的に含める必要はありません:

値を挿入すると、それらの値はTargetテーブルのそれぞれの列に集約されます:

Targetテーブルには、印象とクリックが結合されています:

このクエリは次のような結果を出力するはずです: