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

Overview

非同期マテリアライズドビュー

このトピックでは、非同期マテリアライズドビューの理解、作成、使用、管理方法について説明します。非同期マテリアライズドビューは、StarRocks v2.4以降でサポートされています。

同期マテリアライズドビューと比較して、非同期マテリアライズドビューは複数のテーブルの結合とより多くの集計関数をサポートしています。非同期マテリアライズドビューの更新は、手動でトリガすることもスケジュールされたタスクによってトリガすることもできます。また、マテリアライズドビュー全体ではなく一部のパーティションのみを更新することも可能です。これにより、更新のコストを大幅に削減することができます。さらに、非同期マテリアライズドビューは自動で透明なクエリの書き換えシナリオをサポートし、クエリの高速化を実現します。

同期マテリアライズドビュー(Rollup)のシナリオと使用方法については、同期マテリアライズドビュー(Rollup)を参照してください。

概要

データベース内のアプリケーションでは、大きなテーブルに対して複雑なクエリが頻繁に実行されます。これらのクエリは、数十億行を含むテーブルに対して複数テーブルの結合と集計を行います。これらのクエリの処理には、システムリソースと計算結果の算出にかかる時間の点で費用がかかります。

StarRocksの非同期マテリアライズドビューは、これらの問題に対処するために設計されました。非同期マテリアライズドビューは、1つまたは複数の基本テーブルから予め計算されたクエリ結果を保持する特別な物理テーブルです。基本テーブル上で複雑なクエリを実行すると、StarRocksは関連するマテリアライズドビューから予め計算された結果を返してこれらのクエリを処理します。これにより、繰り返し行われる複雑な計算を回避することで、クエリのパフォーマンスを向上させることができます。このパフォーマンスの違いは、クエリが頻繁に実行される場合や十分に複雑な場合には顕著です。

さらに、非同期マテリアライズドビューはデータウェアハウス上で数学モデルを構築するために特に有用です。これにより、上位のアプリケーションに統一されたデータ仕様を提供し、基盤の実装を隠したり、基本テーブルの生データのセキュリティを保護することができます。

StarRocksにおけるマテリアライズドビューの理解

StarRocksのv2.3およびそれ以前のバージョンでは、単一のテーブル上にのみ構築できる同期マテリアライズドビュー(またはロールアップ)が提供されていました。同期マテリアライズドビュー(Rollup)はデータのリフレッシュコストが低く、データの新鮮さが高いことが特徴です。しかし、v2.4以降でサポートされる非同期マテリアライズドビューと比較して、同期マテリアライズドビューには多くの制約があります。同期マテリアライズドビューを作成してクエリを高速化または書き換えする場合、選択できる集計演算子の選択肢が限られます。

次の表は、StarRocksにおける非同期マテリアライズドビュー(ASYNC MV)と同期マテリアライズドビュー(SYNC MV)の機能の観点からの比較です。

単一テーブルの集計

複数テーブルの結合

クエリの書き換え

リフレッシュ戦略

基本テーブル

ASYNC MV

あり

あり

あり

  • 非同期リフレッシュ
  • 手動リフレッシュ

下記からの複数テーブル:

  • デフォルトカタログ
  • 外部カタログ(v2.5)
  • 既存のマテリアライズドビュー(v2.5)
  • 既存のビュー(v3.1)

SYNC MV(ロールアップ)

制限付きの集計関数の選択肢

なし

あり

データのローディング中の同期リフレッシュ

デフォルトカタログの単一テーブル

基本概念

  • 基本テーブル基本テーブルは、マテリアライズドビューの駆動テーブルです。StarRocksの非同期マテリアライズドビューでは、基本テーブルはStarRocksのネイティブテーブル(デフォルトカタログのテーブル)や、外部カタログのテーブル(v2.5以降でサポート)など、既存の非同期マテリアライズドビューやビュー(v2.5以降でサポート)を含む、あらゆるStarRocksテーブルの種類に基づいて構築できます。
  • リフレッシュ非同期マテリアライズドビューを作成すると、そのデータは作成時点の基本テーブルの状態を反映しています。基本テーブルのデータが変更されると、変更を同期させるためにマテリアライズドビューをリフレッシュする必要があります。現在、StarRocksでは2つの一般的なリフレッシュ戦略をサポートしています。
    • ASYNC: リフレッシュタスクがプリデファインドのリフレッシュ間隔に基づいて、基本テーブルのデータが変更されるたびにマテリアライズドビューが自動的にリフレッシュされます。
    • MANUAL: リフレッシュタスクは手動でトリガされ、マテリアライズドビューは自動的にリフレッシュされません。
  • クエリの書き換えクエリの書き換えとは、基本テーブルに対してクエリを実行する際に、システムがマテリアライズドビュー内の事前計算された結果をクエリの再利用に使用できるかどうかを自動的に判断することを意味します。利用可能な場合、システムは関連するマテリアライズドビューからデータを直接読み込み、時間とリソースを消費する計算や結合を避けるためです。StarRocks v2.5以降では、SPJG型の非同期マテリアライズドビューをベースにした自動的かつ透明なクエリの書き換えをサポートしています。SPJG型マテリアライズドビューは、プランにScan、Filter、Project、Aggregateの演算子のみを含むマテリアライズドビューを指します。

    注意

    JDBCカタログの基になるベーステーブルの非同期マテリアライズドビューは、クエリの書き換えをサポートしていません。

マテリアライズドビューを作成するタイミングの決定

データウェアハウス環境において以下の要件がある場合、非同期マテリアライズドビューを作成することができます。

  • 繰り返し行われる集計関数のクエリの高速化データウェアハウスのほとんどのクエリが、同じ集計関数を使用したサブクエリを含んでおり、これらのクエリが計算リソースの大部分を消費している場合を想定してください。このサブクエリを基に、サブクエリの結果の計算と保存を行う非同期マテリアライズドビューを作成することができます。マテリアライズドビューが作成されると、マテリアライズドビューに基づくクエリがすべて書き換えられ、マテリアライズドビューに保存されている中間結果が読み込まれるため、これらのクエリの実行が高速化されます。
  • 複数のテーブルの定期的な結合データウェアハウス内の複数のテーブルを定期的に結合して新しいワイドテーブルを作成する必要があるとします。これらのテーブルに基づいて非同期マテリアライズドビューを作成し、定期的なリフレッシュタスクをトリガするための非同期リフレッシュ戦略を設定することができます。マテリアライズドビューが作成されると、クエリ結果はマテリアライズドビューから直接返されるため、結合操作によって引き起こされるレイテンシが回避されます。
  • データウェアハウスのレイヤリングデータウェアハウスには大量の生データが含まれており、そこでのクエリは複雑な一連のETL操作を必要とします。データウェアハウス内のデータを分層にするために、複数の層の非同期マテリアライズドビューを作成し、クエリを一連の単純なサブクエリに分割することができます。これにより、繰り返し行われる計算が大幅に削減されるだけでなく、DBAが問題を簡単かつ効率的に特定するのにも役立ちます。また、データウェアハウスのレイヤリングにより、生データと統計データを分離することができ、機密性の高い生データを保護することができます。
  • データレイクでのクエリの高速化データレイクでのクエリの実行は、ネットワークの遅延やオブジェクトストレージのスループットの低下により遅くなる場合があります。データレイクの上に非同期マテリアライズドビューを構築することで、クエリのパフォーマンスを向上させることができます。さらに、StarRocksはクエリを自動的に既存のマテリアライズドビューを使用するよう書き換えることができるため、クエリを手動で修正する手間を省くことができます。

非同期マテリアライズドビューの具体的な使用例については、以下のコンテンツを参照してください:

非同期マテリアライズドビューの作成

StarRocksの非同期マテリアライズドビューは、次のベーステーブルで作成できます。

  • StarRocksのネイティブテーブル(すべてのStarRocksテーブルタイプをサポート)
  • 外部カタログのテーブル、例えば
    • Hiveカタログ(v2.5以降)
    • Hudiカタログ(v2.5以降)
    • Icebergカタログ(v2.5以降)
    • JDBCカタログ(v3.0以降)
  • 既存の非同期マテリアライズドビュー(v2.5以降)
  • 既存のビュー(v3.1以降)

開始する前に

以下の例は、デフォルトカタログ内の2つのベーステーブルを含みます。

  • テーブル goods はアイテムID item_id1、アイテム名 item_name、アイテム価格 price を記録します。
  • テーブル order_list はオーダーID order_id、クライアントID client_id、アイテムID item_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を使用することで、特定のクエリステートメントに基づいてマテリアライズドビューを作成することができます。

テーブル goodsorder_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;

注意

  • 非同期マテリアライズドビューを作成する際は、データディストリビューション戦略またはリフレッシュ戦略、またはその両方を指定する必要があります。
  • 非同期マテリアライズドビューでは、基本テーブルとは異なるパーティショニング戦略やバケット戦略を設定することができますが、マテリアライズドビューを作成するために使用されるクエリステートメントには、マテリアライズドビューのパーティションキーとバケットキーを含める必要があります。
  • 非同期マテリアライズドビューでは、長い期間の間に動的なパーティショニング戦略をサポートしています。たとえば、基本テーブルが1日ごとにパーティション分割されている場合、マテリアライズドビューを1か月ごとにパーティション分割することができます。
  • 現在、StarRocksはリストパーティショニング戦略での非同期マテリアライズドビューの作成をサポートしていません。
  • マテリアライズドビューを作成するためのクエリステートメントでは、rand()、random()、uuid()、sleep()を含むランダム関数はサポートされていません。
  • 非同期マテリアライズドビューはさまざまなデータ型をサポートしています。詳細についてはCREATE MATERIALIZED VIEW - サポートされるデータ型を参照してください。
  • デフォルトでは、CREATE MATERIALIZED VIEWステートメントの実行は即座にリフレッシュタスクをトリガーし、一定のシステムリソースを消費する場合があります。リフレッシュタスクを遅延させる場合は、CREATE MATERIALIZED VIEWステートメントにREFRESH DEFERREDパラメータを追加することができます。
  • 非同期マテリアライズドビューのリフレッシュメカニズムについて現在、StarRocksは2つのリフレッシュ戦略(MANUALリフレッシュおよびASYNCリフレッシュ)をサポートしています。StarRocksのv2.5では、非同期マテリアライズドビューは、リフレッシュのコストを制御し、成功率を向上させるためのさまざまな非同期リフレッシュメカニズムをさらにサポートしています。詳細については、CREATE MATERIALIZED VIEW - Parametersの「PROPERTIES」セクションを参照してください。また、ALTER MATERIALIZED VIEWを使用して、既存の非同期マテリアライズドビューのメカニズムを変更することもできます。

    注意

    リフレッシュタスクがシステムリソースを使い果たすことやタスクの失敗を引き起こさないために、システムリソースの使用量を抑えるために、パーティション分割されたマテリアライズドビューをパーティション分割されたベーステーブルに基づいて作成することをお勧めします。詳細については、データモデリングとマテリアライズドビュー - パーティション化モデリングを参照してください。

    • マテリアライズドビューのパーティションが多い場合、各リフレッシュは多くのリソースを消費する可能性があります。v2.5では、リフレッシュする最大パーティション数を指定することができ、StarRocksは指定された最大パーティション数以下のバッチサイズでリフレッシュを実行します。この機能により、大きな非同期マテリアライズドビューが安定的にリフレッシュされ、データモデリングの安定性と堅牢性が向上します。
    • 非同期マテリアライズドビューのパーティションの有効期限(TTL)を指定することで、マテリアライズドビューが使用するストレージサイズを削減することができます。
    • リフレッシュ範囲を指定することで、最新のいくつかのパーティションのみをリフレッシュすることができ、リフレッシュのオーバーヘッドを削減することができます。
    • データ変更によって対応するマテリアライズドビューが自動的にリフレッシュされないようにするため、データ変更が一定の基本テーブルで自動的にトリガーされないようにすることができます。
    • リフレッシュタスクにリソースグループを割り当てることができます。
  • ネストされたマテリアライズドビューについてStarRocks v2.5では、ネストされた非同期マテリアライズドビューの作成がサポートされています。既存の非同期マテリアライズドビューに基づいて非同期マテリアライズドビューを構築することができます。各マテリアライズドビューのリフレッシュ戦略は、上位の非同期マテリアライズドビューや下位の非同期マテリアライズドビューに影響を与えません。現在、ネストレベルの数は制限されていません。本番環境では、ネストのレイヤ数が3を超えないようにすることをお勧めします。

  • 外部カタログマテリアライズドビューについてStarRocksは、Hiveカタログ(v2.5以降)、Hudiカタログ(v2.5以降)、Icebergカタログ(v2.5以降)、およびJDBCカタログ(v3.0以降)に基づいて非同期マテリアライズドビューを構築することをサポートしています。外部カタログ上にマテリアライズドビューを作成する方法は、デフォルトカタログ上の非同期マテリアライズドビューを作成する方法と似ていますが、いくつかの使用制限があります。詳細については、マテリアライズドビューを使用したデータレイクのクエリ高速化を参照してください。

非同期マテリアライズドビューを手動でリフレッシュする

REFRESH MATERIALIZED VIEWを使用して、非同期マテリアライズドビューを手動でリフレッシュすることができます。StarRocks v2.5では、非同期マテリアライズドビューの特定のパーティションを指定してリフレッシュすることができます。StarRocks v3.1では、リフレッシュタスクを同期的に呼び出すことができ、タスクの成功または失敗時にSQLステートメントが返されます。

-- 非同期コール(デフォルト)によるビューのリフレッシュ
REFRESH MATERIALIZED VIEW order_mv;
-- 同期コールによるビューのリフレッシュ
REFRESH MATERIALIZED VIEW order_mv WITH SYNC MODE;

非同期呼び出しによるリフレッシュタスクをキャンセルするには、CANCEL REFRESH MATERIALIZED VIEWを使用します。

非同期マテリアライズドビューを直接クエリする

作成した非同期マテリアライズドビューは、クエリステートメントに従って事前計算された結果の完全なセットを含む物理テーブルです。したがって、最初のリフレッシュが完了した後は、マテリアライズドビューを直接クエリすることができます。

MySQL > SELECT * FROM order_mv;
+----------+--------------------+
| order_id | total |
+----------+--------------------+
| 10001 | 14.5 |
| 10002 | 10.200000047683716 |
| 10003 | 8.700000047683716 |
+----------+--------------------+
3 rows in set (0.01 sec)

注意

非同期マテリアライズドビューを直接クエリすることができますが、基本テーブルをクエリした結果と一致しない可能性があります。

非同期マテリアライズドビューでクエリの書き換えと高速化

StarRocks v2.5では、SPJG型非同期マテリアライズドビューに基づいた自動的で透明なクエリの書き換えをサポートしています。SPJG型マテリアライズドビューのクエリの書き換えには、単一テーブルのクエリの書き換え、結合クエリの書き換え、集計クエリの書き換え、UNIONクエリの書き換え、およびネストされたマテリアライズドビューに基づくクエリの書き換えが含まれます。詳細については、マテリアライズドビューによるクエリの書き換えを参照してください。

現在、StarRocksでは、デフォルトカタログまたはHiveカタログ、Hudiカタログ、Icebergカタログなどの外部カタログに基づいて作成された非同期マテリアライズドビュー上のクエリを書き換えることができます。デフォルトカタログでデータをクエリする場合、StarRocksは基本テーブルとデータが整合しないマテリアライズドビューを除外することで、書き換えクエリと元のクエリの結果の一貫性を確保します。マテリアライズドビューのデータが期限切れになった場合、マテリアライズドビューは候補として使用されません。外部カタログでデータをクエリする場合、StarRocksは外部カタログのデータ変更を感知することができないため、結果の強い一貫性は確保できません。外部カタログに基づいて作成された非同期マテリアライズドビューについて詳しくは、マテリアライズドビューによるデータレイクのクエリの高速化を参照してください。

注意

JDBCカタログのベーステーブルに作成された非同期マテリアライズドビューは、クエリの書き換えをサポートしていません。

非同期マテリアライズドビューの管理

非同期マテリアライズドビューの変更

ALTER MATERIALIZED VIEWを使用して、非同期マテリアライズドビューのプロパティを変更することができます。

  • 非アクティブなマテリアライズドビューを有効にする。

    ALTER MATERIALIZED VIEW order_mv ACTIVE;
  • 非同期マテリアライズドビューの名前を変更する。

    ALTER MATERIALIZED VIEW order_mv RENAME order_total;
  • 非同期マテリアライズドビューのリフレッシュ間隔を2日に変更する。

    ALTER MATERIALIZED VIEW order_mv REFRESH ASYNC EVERY(INTERVAL 2 DAY);

非同期マテリアライズドビューの表示

SHOW MATERIALIZED VIEWSを使用するか、情報スキーマのシステムメタデータテーブルをクエリすることで、データベース内の非同期マテリアライズドビューを表示することができます。

  • データベース内のすべての非同期マテリアライズドビューを表示する。

    SHOW MATERIALIZED VIEWS;
  • 特定の非同期マテリアライズドビューを表示する。

    SHOW MATERIALIZED VIEWS WHERE NAME = "order_mv";
  • 名前に一致する非同期マテリアライズドビューを表示する。

    SHOW MATERIALIZED VIEWS WHERE NAME LIKE "order%";
  • Information Schemaのメタデータテーブル materialized_views をクエリすることで、すべての非同期マテリアライズドビューを表示することもできます。詳細については、information_schema.materialized_viewsを参照してください。

    SELECT * FROM information_schema.materialized_views;

非同期マテリアライズドビューの定義の表示

SHOW CREATE MATERIALIZED VIEWを使用することで、非同期マテリアライズドビューを作成する際に使用されたクエリを表示することができます。

SHOW CREATE MATERIALIZED VIEW order_mv;

非同期マテリアライズドビューの実行ステータスの確認

StarRocksのInformation Schemaのメタデータテーブル tasks および task_runs をクエリすることで、非同期マテリアライズドビューの実行(構築またはリフレッシュ)ステータスを確認することができます。

以下の例では、最も最近作成されたマテリアライズドビューの実行ステータスを確認しています。

  1. tasks テーブルで最も最近のタスクの TASK_NAME を確認します。

    mysql> select * from information_schema.tasks  order by CREATE_TIME desc limit 1\G;
    *************************** 1. row ***************************
    TASK_NAME: mv-59299
    CREATE_TIME: 2022-12-12 17:33:51
    SCHEDULE: MANUAL
    DATABASE: ssb_1
    DEFINITION: insert overwrite hive_mv_lineorder_flat_1 SELECT `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderkey`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_linenumber`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_custkey`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_partkey`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderpriority`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_ordtotalprice`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_revenue`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`p_mfgr`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`s_nation`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`c_city`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`c_nation`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderdate`
    FROM `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`
    WHERE `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderdate` = '1997-01-01'
    EXPIRE_TIME: NULL
    1 row in set (0.02 sec)
  2. 上記で見つけた TASK_NAME を使用して、テーブル task_runs で実行ステータスを確認します。

    mysql> select * from information_schema.task_runs where task_name='mv-59299' order by CREATE_TIME \G;
    *************************** 1. row ***************************
    QUERY_ID: d9cef11f-7a00-11ed-bd90-00163e14767f
    TASK_NAME: mv-59299
    CREATE_TIME: 2022-12-12 17:39:19
    FINISH_TIME: 2022-12-12 17:39:22
    STATE: SUCCESS
    DATABASE: ssb_1
    DEFINITION: insert overwrite hive_mv_lineorder_flat_1 SELECT `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderkey`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_linenumber`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_custkey`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_partkey`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderpriority`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_ordtotalprice`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_revenue`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`p_mfgr`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`s_nation`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`c_city`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`c_nation`, `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderdate`
    FROM `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`
    WHERE `hive_ci`.`dla_scan`.`lineorder_flat_1000_1000_orc`.`lo_orderdate` = '1997-01-01'
    EXPIRE_TIME: 2022-12-15 17:39:19
    ERROR_CODE: 0
    ERROR_MESSAGE: NULL
    PROGRESS: 100%
    2 rows in set (0.02 sec)

非同期マテリアライズドビューの削除

DROP MATERIALIZED VIEWを使用して、