非同期マテリアライズドビュー
このトピックでは、非同期マテリアライズドビューの理解、作成、使用、および管理方法について説明します。
同期マテリアライズドビューと比較して、非同期マテリアライズドビューはマルチテーブルジョインとより多くの集計関数をサポートします。非同期マテリアライズドビューのリフレッシュは手動またはスケジュールされたタスクによってトリガーされます。また、マテリアライズドビュー全体ではなく一部のパーティションをリフレッシュすることもでき、リフレッシュのコストを大幅に削減します。さらに、非同期マテリアライズドビューはさまざまなクエリの書き換えシナリオをサポートし、自動的かつ透明なクエリアクセラレーションを可能にします。
同期マテリアライズドビュー(ロールアップ)のシナリオと使用法については、同期マテリアライズドビュー(ロールアップ) を参照してください。
概要
データベースのアプリケーションは、大規模なテーブルに対して複雑なクエリを実行することがよくあります。これらのクエリは、数十億行を含むテーブルに対するマルチテーブルジョインや集計を含みます。これらのクエリを処理するには、システムリソースと結果を計算する時間の観点から高コストです。
CelerData の非同期マテリアライズドビューは、これらの問題に対処するために設計されています。非同期マテリアライズドビューは、1つ以上のベーステーブルから事前計算されたクエリ結果を保持する特別な物理テーブルです。ベーステーブルに対して複雑なクエリを実行すると、CelerData は関連するマテリアライズドビューから事前計算された結果を返し、これらのクエリを処理します。この方法により、繰り返しの複雑な計算を回避できるため、クエリパフォーマンスが向上します。このパフォーマンスの違いは、クエリが頻繁に実行される場合や十分に複雑な場合に顕著です。
さらに、非同期マテリアライズドビューは、データウェアハウス上に数学モデルを構築するのに特に役立ちます。これにより、上位層のアプリケーションに統一されたデータ仕様を提供し、基盤となる実装を隠したり、ベーステーブルの生データのセキュリティを保護したりできます。
CelerData におけるマテリアライズドビュ ーの理解
CelerData は、単一テーブルのみに構築できる同期マテリアライズドビューを提供します。同期マテリアライズドビュー、またはロールアップは、データの新鮮さを保ち、リフレッシュコストを低く抑えます。しかし、非同期マテリアライズドビューと比較すると、同期マテリアライズドビューには多くの制限があります。クエリを加速または書き換えるために同期マテリアライズドビューを構築したい場合、集計演算子の選択肢が限られています。
次の表は、CelerData における非同期マテリアライズドビュー(ASYNC MV)と同期マテリアライズドビュー(SYNC MV)のサポートする機能の観点からの比較を示しています。
単一テーブル集計 | マルチテーブルジョイン | クエリの書き換え | リフレッシュ戦略 | ベーステーブル | |
---|---|---|---|---|---|
ASYNC MV | はい | はい | はい |
| 複数のテーブルから:
|
SYNC MV (Rollup) | 集計関数の選択肢が限られている | いいえ | はい | データロード中の同期リフレッシュ | Default Catalog の単 一テーブル |
基本概念
-
ベーステーブル
ベーステーブルは、マテリアライズドビューの駆動テーブルです。
CelerData の非同期マテリアライズドビューでは、ベーステーブルは default catalog の CelerData 内部テーブル、外部カタログのテーブル、または既存の非同期マテリアライズドビューやビューであることができます。CelerData は、すべてのテーブルタイプ に対して非同期マテリアライズドビューの作成をサポートしています。
-
リフレッシュ
非同期マテリアライズドビューを作成すると、そのデータはその時点でのベーステーブルの状態のみを反映します。ベーステーブルのデータが変更された場合、マテリアライズドビューをリフレッシュして変更を同期させる必要があります。
現在、CelerData は 2 つの一般的なリフレッシュ戦略をサポートしています: ASYNC(タスクによって定期的にトリガーされるリフレッシュ)と MANUAL(ユーザーによって手動でトリガーされるリフレッシュ)。
-
クエリの書き換え
クエリの書き換えとは、マテリアライズドビューが構築されたベーステーブルに対してクエリを実行する際に、システムがマテリアライズドビューの事前計算された結果をクエリに再利用できるかどうかを自動的に判断することを意味します。再利用できる場合、システムは関連するマテリアライズドビューからデータを直接ロードし、時間とリソースを消費する計算やジョインを回避します。
CelerData は、Default Catalog または Hive catalog、Hudi catalog、Iceberg catalog などの外部カタログに作成された SPJG タイプの非同期マテリアライズドビューに基づく自動かつ透明なクエリの書き換えをサポートしています。
マテリアライズドビューを作成するタイミングを決定する
データウェアハウス環境で次のような要求がある場合、非同期マテリアライズドビューを作成できます。
-
繰り返しの集計関数を使用したクエリの加速
データウェアハウスのほとんどのクエリが集計関数を含む同じサブクエリを含んでおり、これらのクエリが計算リソースの大部分を消費しているとします。このサブクエリに基づいて、非同期マテリアライズドビューを作成できます。このビューはサブクエリのすべての結果を計算して保存します。マテリアライズドビューが構築された後、CelerData はサブクエリを含むすべてのクエリを書き換え、マテリアライズドビューに保存された中間結果をロードし、これらのクエリを加速します。
-
複数テーブルの定期的なジョイン
デー タウェアハウスで複数のテーブルを定期的にジョインして新しいワイドテーブルを作成する必要があるとします。これらのテーブルに対して非同期マテリアライズドビューを構築し、固定時間間隔でリフレッシュタスクをトリガーする ASYNC リフレッシュ戦略を設定できます。マテリアライズドビューが構築された後、クエリ結果はマテリアライズドビューから直接返され、JOIN 操作による遅延が回避されます。
-
データウェアハウスのレイヤリング
データウェアハウスに大量の生データが含まれており、クエリには複雑な ETL 操作が必要な場合、データウェアハウス内のデータを階層化するために複数の非同期マテリアライズドビューを構築し、クエリを一連の単純なサブクエリに分解できます。これにより、繰り返しの計算を大幅に削減し、さらに重要なことに、DBA が問題を簡単かつ効率的に特定するのに役立ちます。それに加えて、データウェアハウスのレイヤリングは、生データと統計データを分離し、機密性の高い生データのセキュリティを保護します。
-
データレイクでのクエリの加速
ネットワーク遅延やオブジェクトストレージのスループットのために、データレイクのクエリは遅くなることがあります。しかし、データレイクの上に非同期マテリアライズドビューを構築して生データをフィルタリングすることで、クエリパフォーマンスを向上させることができます。CelerData は、外部ソースからのデータが変更されるたびにマテリアライズドビューを自動的にリフレッシュし、データの一貫性を確保します。さらに、CelerData の SQL オプティマイザは、既存のマテリアライズドビューを使用するようにクエリをインテリジェントに書き換え、クエリを手動で変更する手間を省きます。
非同期マテリアライズドビューを作成する
CelerData の非同期マテリアライズドビューは、次のベーステーブルに基づいて作成できます。
- CelerData のすべてのテーブルタイプの内部テーブル
- Hive catalog、Hudi catalog、Iceberg catalog のテーブル
- 既存の非同期マテリアライズドビュー
- 既存のビュー
始める前に
ベーステーブルの準備
次の例では、2 つのベーステーブルを使用します。
- テーブル
goods
は、アイテム IDitem_id1
、アイテム名item_name
、アイテム価格price
を記録します。 - テーブル
order_list
は、注文 IDorder_id
、クライアント IDclient_id
、アイテム IDitem_id2
、注文日order_date
を記録します。
カラム goods.item_id1
はカラム order_list.item_id2
と同等です。
次のステートメントを実行してテーブルを作成し、データを挿入します。
CREATE TABLE goods(
item_id1 INT,
item_name STRING,
price FLOAT
) DISTRIBUTED BY HASH(item_id1);
INSERT INTO goods
VALUES
(1001,"apple",6.5),
(1002,"pear",8.0),
(1003,"potato",2.2);
CREATE TABLE order_list(
order_id INT,
client_id INT,
item_id2 INT,
order_date DATE
) DISTRIBUTED BY HASH(order_id);
INSERT INTO order_list
VALUES
(10001,101,1001,"2022-03-13"),
(10001,101,1002,"2022-03-13"),
(10002,103,1002,"2022-03-13"),
(10002,103,1003,"2022-03-14"),
(10003,102,1003,"2022-03-14"),
(10003,102,1001,"2022-03-14");