非同期マテリアライズドビュー
このトピックでは、非同期マテリアライズドビューの理解、作成、使用、および管理方法について説明します。
同期マテリアライズドビューと比較して、非同期マテリアライズドビューはマルチテーブルジョインとより多くの集計関数をサポートします。非同期マテリアライズドビューのリフレッシュは手動またはスケジュールされたタスクによってトリガーされます。また、マテリアライズドビュー全体ではなく一部のパーティションをリフレッシュすることもでき、リフレッシュのコストを大幅に削減します。さらに、非同期マテリアライズドビューはさまざまなクエリの書き換えシナリオをサポートし、自動的かつ透明なクエリアクセラレーションを可能にします。
同期マテリアライズドビュー(ロールアップ)のシナリオと使用法については、同期マテリアライズドビュー(ロールアップ) を参照してください。
概要
データベースのアプリケーションは、大規模なテーブルに対して複雑なクエリを実行することがよくあります。これらのクエ リは、数十億行を含むテーブルに対するマルチテーブルジョインや集計を含みます。これらのクエリを処理するには、システムリソースと結果を計算する時間の観点から高コストです。
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");
次の例のシナリオでは、各注文の合計を頻繁に計算する必要があります。これには、2 つのベーステーブルの頻繁なジョインと集計関数 sum()
の集中的な使用が必要です。さらに、ビジネスシナリオでは、データを 1 日間隔でリフレッシュする必要があります。
クエリステートメントは次のとおりです。
SELECT
order_id,
sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;
マテリアライズドビューを作成する
特定のクエリステートメントに基づいてマテリアライズドビューを作成するには、CREATE MATERIALIZED VIEW を使用します。
テーブル goods
、order_list
、および前述のクエリステートメントに基づいて、次の例では各注文の合計を分析するためのマテリアライズドビュー order_mv
を作成します。マテリアライズドビューは 1 日間隔で自動的にリフレッシュされるように設定されています。
CREATE MATERIALIZED VIEW order_mv
DISTRIBUTED BY HASH(`order_id`)
REFRESH ASYNC START('2022-09-01 10:00:00') EVERY (interval 1 day)
AS SELECT
order_list.order_id,
sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;
NOTE
- 非同期マテリアライズドビューを作成する際には、バケッティング戦略を指定する必要があります。
- 非同期マテリアライズドビューには、ベーステーブルとは異なるパーティショニングおよびバケッティング戦略を設定できます。
- 非同期マテリアライズドビューは、より長いスパンでの動的パーティショニング戦略をサポートしています。たとえば、ベーステーブルが 1 日間隔 でパーティション化されている場合、マテリアライズドビューを 1 か月間隔でパーティション化するように設定できます。
- 非同期マテリアライズドビューを作成するために使用されるクエリステートメントには、マテリアライズドビューのパーティションキーとバケットキーを含める必要があります。
- マテリアライズドビューを作成するために使用されるクエリステートメントは、rand()、random()、uuid()、sleep() などのランダム関数をサポートしていません。
- 非同期マテリアライズドビューは、さまざまなデータタイプをサポートしています。詳細については、CREATE MATERIALIZED VIEW - サポートされるデータタイプ を参照してください。
-
非同期マテリアライズドビューのリフレッシュメカニズムについて
現在、CelerData は 2 つの ON DEMAND リフレッシュ戦略をサポートしています: 手動リフレッシュと固定時間間隔での定期リフレッシュ。
非同期マテリアライズドビューは、さまざまな非同期リフレッシュメカニズムをさらにサポートしています。
- マテリアライズドビューに多くの大きなパーティションがある場合、各リフレッシュは大量のリソースを消費する可能性があります。CelerData はリフレッシュタスクの分割をサポートしています。リフレッシュする最大パーティション数を指定でき、CelerData は指定された最大パーティション数以下のバッチサイズでリフレッシュを実行します。この機能により、大規模な非同期マテリアライズドビューが安定 してリフレッシュされ、データモデリングの安定性と堅牢性が向上します。
- 非同期マテリアライズドビューのパーティションの有効期限(TTL)を指定して、マテリアライズドビューが占有するストレージサイズを削減できます。
- リフレッシュ範囲を指定して、最新のいくつかのパーティションのみをリフレッシュし、リフレッシュのオーバーヘッドを削減できます。
詳細については、CREATE MATERIALIZED VIEW - パラメータ の PROPERTIES セクションを参照してください。既存の非同期マテリアライズドビューのメカニズムを変更するには、ALTER MATERIALIZED VIEW を使用できます。
-
ネストされたマテリアライズドビューについて
CelerData はネストされた非同期マテリアライズドビューの作成をサポートしています。既存の非同期マテリアライズドビューに基づいて非同期マテリアライズドビューを構築できます。各マテリアライズドビューのリフレッシュ戦略は、上位または下位のマテリアライズドビューには影響しません。現在、CelerData はネストのレベル数を制限していません。実稼働環境では、ネストのレイヤー数が 3 を超えないことを推奨します。
-
外部カタログマテリアライズドビューについて
CelerData は、Hive catalog、Hudi catalog、Iceberg catalog に基づく非同期マテリアライズドビューの作成をサポートしています。外部カタログマテリアライズドビューは、一般的な非同 期マテリアライズドビューと同様に作成されますが、以下の使用制限があります。
-
外部カタログのベーステーブルとマテリアライズドビューの間の厳密な一貫性は保証されません。
-
現在、外部リソースに基づく非同期マテリアライズドビューの構築はサポートされていません。
-
現在、CelerData は Iceberg catalog および Hudi catalog のベーステーブルのデータ変更を認識できないため、リフレッシュタスクがトリガーされるたびにすべてのパーティションがデフォルトでリフレッシュされます。一部のパーティションのみをリフレッシュしたい場合は、REFRESH MATERIALIZED VIEW ステートメントを使用して手動でマテリアライズドビューをリフレッシュし、リフレッシュしたいパーティションを指定できます。
-
CelerData は、頻繁にアクセスされる Hive catalog のキャッシュされたメタデータを定期的にリフレッシュしてデータ変更を認識することができます。Hive メタデータキャッシュのリフレッシュは、以下の FE パラメータを通じて設定できます。
設定項目 デフォルト 説明 enable_background_refresh_connector_metadata true
定期的な Hive メタデータキャッシュのリフレッシュを有効にするかどうか。これを有効にすると、CelerData は Hive クラスターのメタストア(Hive Metastore または AWS Glue)をポーリングし、頻繁にアクセスされる Hive catalog のキャッシュされたメタデータをリフレッシュしてデータ変更を認識します。 true
は Hive メタデータキャッシュのリフレッシュを有効にし、false
は無効にします。この項目は FE 動的パラメータです。ADMIN SET FRONTEND CONFIG コマンドを使用して変更できます。background_refresh_metadata_interval_millis 600000
(10 分)2 つの連続した Hive メタデータキャッシュリフレッシュの間隔。単位: ミリ秒。この項目は FE 動的パラメータです。ADMIN SET FRONTEND CONFIG コマンドを使用して変更できます。 background_refresh_metadata_time_secs_since_last_access_secs 86400
(24 時間)Hive メタデータキャッシュリフレッシュタスクの有効期限。アクセスされた Hive catalog に対して、指定された時間を超えてアクセスされていない場合、CelerData はそのキャッシュされたメタデータのリフレッシュを停止します。アクセスされていない Hive catalog に対して、CelerData はそのキャッシュされたメタデータをリフレッシュしません。単位: 秒。この項目は FE 動的パラメータです。ADMIN SET FRONTEND CONFIG コマンドを使用して変更できます。
-