メインコンテンツまでスキップ
バージョン: Candidate-4.1

CREATE MATERIALIZED VIEW

説明

マテリアライズドビューを作成します。マテリアライズドビューの使用方法については、同期マテリアライズドビューおよび非同期マテリアライズドビューを参照してください。

注意

  • ベーステーブルが存在するデータベースでCREATE MATERIALIZED VIEW権限を持つユーザーのみがマテリアライズドビューを作成できます。
  • v3.4.0以降、StarRocksは共有データクラスタでの同期マテリアライズドビューの作成をサポートしています。

マテリアライズドビューの作成は非同期操作です。このコマンドが成功すると、マテリアライズドビューの作成タスクが正常に送信されたことを示します。データベース内の同期マテリアライズドビューの構築状況はSHOW ALTER MATERIALIZED VIEWコマンドで確認でき、非同期マテリアライズドビューの状況はメタデータビューtasksおよびtask_runsInformation Schemaでクエリすることで確認できます。

StarRocksはv2.4から非同期マテリアライズドビューをサポートしています。以前のバージョンにおける非同期マテリアライズドビューと同期マテリアライズドビューの主な違いは次のとおりです。

単一テーブル集計複数テーブルジョインクエリの書き換えリフレッシュ戦略ベーステーブル
ASYNC MVはいはいはい
  • 非同期リフレッシュ
  • 手動リフレッシュ
複数のテーブルから:
  • Default Catalog
  • External catalogs (v2.5)
  • 既存のマテリアライズドビュー (v2.5)
  • 既存のビュー (v3.1)
SYNC MV (Rollup)集計関数の選択肢が限られるいいえはいデータロード中の同期リフレッシュDefault Catalog内の単一テーブル

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

構文

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>
[COMMENT ""]
[PROPERTIES ("key"="value", ...)]
AS
<query_statement>

角括弧 [] 内のパラメータはオプションです。

パラメータ

mv_name (必須)

マテリアライズドビューの名前。命名要件は次のとおりです。

  • 名前は文字 (a-z または A-Z)、数字 (0-9)、またはアンダースコア (_) で構成され、文字で始まる必要があります。
  • 名前の長さは64文字を超えてはなりません。
  • 名前は大文字と小文字を区別します。

COMMENT (オプション)

マテリアライズドビューに関するコメント。COMMENTmv_nameの後に配置する必要があります。そうでない場合、マテリアライズドビューは作成されません。

query_statement (必須)

マテリアライズドビューを作成するためのクエリステートメント。その結果がマテリアライズドビューのデータとなります。構文は次のとおりです。

SELECT select_expr[, select_expr ...]
[WHERE where_expr]
[GROUP BY column_name[, column_name ...]]
[ORDER BY column_name[, column_name ...]]
  • select_expr (必須)

    クエリステートメント内のすべての列、つまりマテリアライズドビューのスキーマ内のすべての列。このパラメータは次の値をサポートします。

    • 単純な列または集計列、例: SELECT a, abs(b), min(c) FROM table_a。ここでabcはベーステーブルの列名です。マテリアライズドビューの列名を指定しない場合、StarRocksは自動的に列に名前を付けます。
    • 式、例: SELECT a+1 AS x, b+2 AS y, c*c AS z FROM table_a。ここでa+1b+2c*cはベーステーブルの列を参照する式で、xyzはマテリアライズドビューの列に割り当てられたエイリアスです。

    注意

    • select_exprで少なくとも1つの列を指定する必要があります。
    • 集計関数を持つ同期マテリアライズドビューを作成する場合、GROUP BY句を指定し、select_exprで少なくとも1つのGROUP BY列を指定する必要があります。
    • 同期マテリアライズドビューはJOINやGROUP BYのHAVING句などの句をサポートしていません。
    • v3.1以降、各同期マテリアライズドビューはベーステーブルの各列に対して複数の集計関数をサポートできます。例: select b, sum(a), min(a) from table group by bのようなクエリステートメント。
    • v3.1以降、同期マテリアライズドビューはSELECTおよび集計関数の複雑な式をサポートします。例: select b, sum(a + 1) as sum_a1, min(cast (a as bigint)) as min_a from table group by bselect abs(b) as col1, a + 1 as col2, cast(a as bigint) as col3 from tableのようなクエリステートメント。同期マテリアライズドビューで使用される複雑な式には次の制限があります:
      • 各複雑な式にはエイリアスが必要で、ベーステーブルのすべての同期マテリアライズドビュー間で異なる複雑な式には異なるエイリアスを割り当てる必要があります。例: select b, sum(a + 1) as sum_a from table group by bselect b, sum(a) as sum_a from table group by bのようなクエリステートメントは、同じベーステーブルに対して同期マテリアライズドビューを作成するために使用できません。複雑な式に異なるエイリアスを設定できます。
      • 複雑な式で作成された同期マテリアライズドビューによってクエリが書き換えられているかどうかを確認するには、EXPLAIN <sql_statement>を実行します。詳細については、クエリ分析を参照してください。
  • WHERE (オプション)

    v3.1.8以降、同期マテリアライズドビューはマテリアライズドビューに使用される行をフィルタリングするWHERE句をサポートします。

  • GROUP BY (オプション)

    クエリのGROUP BY列。このパラメータが指定されていない場合、データはデフォルトでグループ化されません。

  • ORDER BY (オプション)

    クエリのORDER BY列。

    • ORDER BY句の列は、select_exprの列と同じ順序で宣言する必要があります。
    • クエリステートメントにGROUP BY句が含まれている場合、ORDER BY列はGROUP BY列と同一でなければなりません。
    • このパラメータが指定されていない場合、システムは次のルールに従ってORDER BY列を自動的に補完します:
      • マテリアライズドビューがAGGREGATEタイプの場合、すべてのGROUP BY列が自動的にソートキーとして使用されます。
      • マテリアライズドビューがAGGREGATEタイプでない場合、StarRocksはプレフィックス列に基づいてソートキーを自動的に選択します。

同期マテリアライズドビューのクエリ

同期マテリアライズドビューは本質的にベーステーブルのインデックスであり、物理テーブルではないため、ヒント[_SYNC_MV_]を使用してのみ同期マテリアライズドビューをクエリできます。

-- ヒント内の角括弧 [] を省略しないでください。
SELECT * FROM <mv_name> [_SYNC_MV_];

注意

現在、StarRocksは、エイリアスを指定しても同期マテリアライズドビューの列に対して自動的に名前を生成します。

同期マテリアライズドビューによる自動クエリの書き換え

同期マテリアライズドビューのパターンに従ったクエリが実行されると、元のクエリステートメントが自動的に書き換えられ、マテリアライズドビューに保存された中間結果が使用されます。

次の表は、元のクエリの集計関数とマテリアライズドビューを構築するために使用される集計関数の対応を示しています。ビジネスシナリオに応じて、対応する集計関数を選択してマテリアライズドビューを構築できます。

元のクエリの集計関数マテリアライズドビューの集計関数
sumsum
minmin
maxmax
countcount
bitmap_union, bitmap_union_count, count(distinct)bitmap_union
hll_raw_agg, hll_union_agg, ndv, approx_count_distincthll_union
percentile_approx, percentile_unionpercentile_union

上記の関数に加えて、StarRocks v3.4.0以降では、同期マテリアライズドビューは汎用集計関数もサポートしています。汎用集計関数の詳細については、汎用集計関数の状態を参照してください。

-- Create a synchronous materialized view test_mv1 to store aggregate states.
CREATE MATERIALIZED VIEW test_mv1
AS
SELECT
dt,
-- Original aggregate functions.
min(id) AS min_id,
max(id) AS max_id,
sum(id) AS sum_id,
bitmap_union(to_bitmap(id)) AS bitmap_union_id,
hll_union(hll_hash(id)) AS hll_union_id,
percentile_union(percentile_hash(id)) AS percentile_union_id,
-- Generic aggregate state functions.
ds_hll_count_distinct_union(ds_hll_count_distinct_state(id)) AS hll_id,
avg_union(avg_state(id)) AS avg_id,
array_agg_union(array_agg_state(id)) AS array_agg_id,
min_by_union(min_by_state(province, id)) AS min_by_province_id
FROM t1
GROUP BY dt;

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

構文

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>
[COMMENT ""]
-- `distribution_desc`または`refresh_scheme`のいずれか、または両方を指定する必要があります。
-- distribution_desc
[DISTRIBUTED BY HASH(<bucket_key>[,<bucket_key2> ...]) [BUCKETS <bucket_number>]]
-- refresh_desc
[REFRESH
-- refresh_moment
[IMMEDIATE | DEFERRED]
-- refresh_scheme
[ASYNC | ASYNC [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]
]
-- partition_expression
[PARTITION BY
{<date_column> | date_trunc(fmt, <date_column>)}
]
-- order_by_expression
[ORDER BY (<sort_key>)]
[PROPERTIES ("key"="value", ...)]
AS
<query_statement>

角括弧 [] 内のパラメータはオプションです。

パラメータ

mv_name (必須)

マテリアライズドビューの名前。命名要件は次のとおりです。

  • 名前は文字 (a-z または A-Z)、数字 (0-9)、またはアンダースコア (_) で構成され、文字で始まる必要があります。
  • 名前の長さは64文字を超えてはなりません。
  • 名前は大文字と小文字を区別します。

注意

同じベーステーブルに対して複数のマテリアライズドビューを作成できますが、同じデータベース内でマテリアライズドビューの名前を重複させることはできません。

COMMENT (オプション)

マテリアライズドビューに関するコメント。COMMENTmv_nameの後に配置する必要があります。そうでない場合、マテリアライズドビューは作成されません。

distribution_desc (オプション)

非同期マテリアライズドビューのバケット戦略。StarRocksはハッシュバケット法とランダムバケット法 (v3.1以降) をサポートしています。このパラメータを指定しない場合、StarRocksはランダムバケット戦略を使用し、バケット数を自動的に設定します。

注意

非同期マテリアライズドビューを作成する際、distribution_descまたはrefresh_schemeのいずれか、または両方を指定する必要があります。

  • ハッシュバケット法:

    構文

    DISTRIBUTED BY HASH (<bucket_key1>[,<bucket_key2> ...]) [BUCKETS <bucket_number>]

    詳細については、データ分散を参照してください。

    注意

    v2.5.7以降、StarRocksはテーブルを作成する際やパーティションを追加する際にバケット数 (BUCKETS) を自動的に設定できます。バケット数を手動で設定する必要はありません。詳細については、バケット数の設定を参照してください。

  • ランダムバケット法:

    ランダムバケット戦略を選択し、StarRocksにバケット数を自動的に設定させる場合、distribution_descを指定する必要はありません。ただし、バケット数を手動で設定したい場合は、次の構文を参照してください。

    DISTRIBUTED BY RANDOM BUCKETS <bucket_number>

    注意

    ランダムバケット戦略を持つ非同期マテリアライズドビューは、コロケーショングループに割り当てることができません。

    詳細については、ランダムバケット法を参照してください。

refresh_moment (オプション)

マテリアライズドビューのリフレッシュタイミング。デフォルト値: IMMEDIATE。有効な値:

  • IMMEDIATE: 非同期マテリアライズドビューは作成後すぐにリフレッシュされます。
  • DEFERRED: 非同期マテリアライズドビューは作成後にリフレッシュされません。マテリアライズドビューを手動でリフレッシュするか、定期的なリフレッシュタスクをスケジュールできます。

refresh_scheme (オプション)

注意

  • 非同期マテリアライズドビューを作成する際、distribution_descまたはrefresh_schemeのいずれか、または両方を指定する必要があります。
  • 外部テーブルのマテリアライズドビューは、ベーステーブルのデータ変更によってトリガーされる自動リフレッシュをサポートしていません。非同期の定期リフレッシュと手動リフレッシュのみをサポートします。

非同期マテリアライズドビューのリフレッシュ戦略。有効な値:

  • ASYNC: 自動リフレッシュモード。ベーステーブルデータが変更されるたびに、マテリアライズドビューが自動的にリフレッシュされます。
  • ASYNC [START (<start_time>)] EVERY(INTERVAL <interval>): 定期リフレッシュモード。定義された間隔でマテリアライズドビューが定期的にリフレッシュされます。間隔はEVERY (interval n day/hour/minute/second)として指定できます。使用可能な単位はDAYHOURMINUTESECONDです。デフォルト値は10 MINUTEです。リフレッシュ開始時間をSTART('yyyy-MM-dd hh:mm:ss')としてさらに指定できます。開始時間が指定されていない場合、現在の時間が使用されます。例: ASYNC START ('2023-09-12 16:30:25') EVERY (INTERVAL 5 MINUTE)
  • MANUAL: 手動リフレッシュモード。リフレッシュタスクを手動でトリガーしない限り、マテリアライズドビューはリフレッシュされません。

このパラメータが指定されていない場合、デフォルト値MANUALが使用されます。

partition_expression (オプション)

非同期マテリアライズドビューのパーティション戦略。StarRocksの現在のバージョンでは、非同期マテリアライズドビューを作成する際に1つのパーティション式のみがサポートされています。

有効な値:

  • column_name: パーティション化に使用される列の名前。PARTITION BY dtという式は、dt列に従ってマテリアライズドビューをパーティション化することを意味します。
  • date_trunc関数: 時間単位を切り捨てるために使用される関数。PARTITION BY date_trunc("MONTH", dt)は、dt列を月単位で切り捨ててパーティション化することを意味します。date_trunc関数は、YEARMONTHDAYHOURMINUTEの単位で時間を切り捨てることをサポートします。
  • str2date関数: ベーステーブルの文字列型パーティションをマテリアライズドビューのパーティションに変換するために使用される関数。PARTITION BY str2date(dt, "%Y%m%d")は、dt列が"%Y%m%d"の日付形式を持つ文字列日付型であることを意味します。str2date関数は多くの日付形式をサポートしており、詳細についてはstr2dateを参照してください。v3.1.4からサポートされています。
  • time_slice関数: v3.1以降、これらの関数を使用して、指定された時間の粒度に基づいて、与えられた時間を時間間隔の開始または終了に変換することができます。例: PARTITION BY date_trunc("MONTH", time_slice(dt, INTERVAL 7 DAY))。time_sliceはdate_truncよりも細かい粒度を持たなければなりません。これらを使用して、パーティションキーよりも細かい粒度を持つGROUP BY列を指定することができます。例: GROUP BY time_slice(dt, INTERVAL 1 MINUTE) PARTITION BY date_trunc('DAY', ts)

v3.5.0以降、非同期マテリアライズドビューは複数列パーティション式をサポートしています。マテリアライズドビューに複数のパーティション列を指定し、ベーステーブルのパーティション列と1対1でマッピングできます。

複数列パーティション式に関する注意事項:

  • 現在、マテリアライズドビューの複数列パーティションは、ベーステーブルのパーティション列と直接マッピングすることのみがサポートされており、ベーステーブルのパーティション列+関数式の加工後のマッピングはサポートされていません。

  • Icebergのパーティション式はTransform機能をサポートしているため、Icebergのパーティション式をStarRocksにマッピングする際は、パーティション式の追加処理が必要です。以下が両者の対応関係です:

    Iceberg TransformIceberg パーティション式マテリアライズドビューパーティション式
    Identity<col><col>
    hourhour(<col>)date_trunc('hour', <col>)
    dayday(<col>)date_trunc('day', <col>)
    monthmonth(<col>)date_trunc('month', <col>)
    yearyear(<col>)date_trunc('year', <col>)
    bucketbucket(<col>, <n>)サポートされていません
    truncatetruncate(<col>)サポートされていません
  • 非Icebergタイプのパーティション列については、パーティション式の計算が関与しないため、マテリアライズドビュー作成時は直接マッピングを選択するだけで、追加のパーティション式処理は必要ありません。

複数列パーティション式の詳細なガイダンスについては、例5を参照してください。

このパラメータが指定されていない場合、デフォルトではパーティション戦略は採用されません。

order_by_expression (オプション)

非同期マテリアライズドビューのソートキー。このソートキーを指定しない場合、StarRocksはSELECT列からいくつかのプレフィックス列をソートキーとして選択します。例: select a, b, c, dでは、ソートキーとしてabを使用できます。このパラメータはStarRocks v3.0以降でサポートされています。

注意 マテリアライズドビューには2つの異なるORDER BYの使用方法があります:

  • CREATE MATERIALIZED VIEWステートメントのORDER BYはマテリアライズドビューのソートキーを定義し、ソートキーに基づくクエリの加速に役立ちます。これはマテリアライズドビューのSPJGベースの透過的加速機能には影響しませんが、マテリアライズドビューのクエリ結果のグローバルソートを保証しません。
  • マテリアライズドビューのクエリ定義のORDER BYはクエリ結果のグローバルソートを保証しますが、マテリアライズドビューがSPJGベースの透過的クエリの書き換えに使用されることを防ぎます。したがって、マテリアライズドビューがクエリの書き換えに使用される場合、マテリアライズドビューのクエリ定義でORDER BYを使用すべきではありません。

INDEX (オプション)

非同期マテリアライズドビューは、クエリパフォーマンスを高速化するために Bitmap インデックスと BloomFilter インデックスをサポートしています。Bitmap インデックスと BloomFilter インデックスの使用例と情報の詳細については、Bitmap IndexBloom filter Index を参照してください。

Bitmap インデックスの使用:

-- インデックスを作成する  
CREATE INDEX <index_name> ON <mv_name>(<column_name>) USING BITMAP COMMENT '<comment>';

-- インデックス作成の状況を確認する
SHOW ALTER TABLE COLUMN;

-- インデックスを確認する
SHOW INDEXES FROM <mv_name>;

-- インデックスを削除する
DROP INDEX <index_name> ON <mv_name>;

BloomFilter インデックスの使用:

-- インデックスを作成する  
ALTER MATERIALIZED VIEW <mv_name> SET ("bloom_filter_columns" = "<col1,col2,col3,...>");

-- インデックスを確認する
SHOW CREATE MATERIALIZED VIEW <mv_name>;

-- インデックスを削除する
ALTER MATERIALIZED VIEW <mv_name> SET ("bloom_filter_columns" = "");

PROPERTIES (オプション)

非同期マテリアライズドビューのプロパティ。既存のマテリアライズドビューのプロパティを変更するには、ALTER MATERIALIZED VIEWを使用できます。

  • session.: マテリアライズドビューのセッション変数関連のプロパティを変更したい場合、プロパティにsession.プレフィックスを追加する必要があります。例: session.insert_timeout。非セッションプロパティの場合、プレフィックスを指定する必要はありません。例: mv_rewrite_staleness_second

  • replication_num: 作成するマテリアライズドビューのレプリカの数。

  • storage_medium: 記憶媒体のタイプ。有効な値: HDDSSD

  • storage_cooldown_time: パーティションのストレージクールダウン時間。HDDとSSDの両方の記憶媒体が使用されている場合、このプロパティで指定された時間の後、SSDストレージのデータはHDDストレージに移動されます。形式: "yyyy-MM-dd HH:mm:ss"。指定された時間は現在の時間より後でなければなりません。このプロパティが明示的に指定されていない場合、デフォルトではストレージクールダウンは実行されません。

  • bloom_filter_columns: BloomFilter インデックスを有効にするカラム名の配列。BloomFilter インデックスについての詳細は、ブルーム・フィルター・インデックス を参照ください。

  • partition_ttl: パーティションの有効期限 (TTL)。指定された時間範囲内のデータを持つパーティションが保持されます。期限切れのパーティションは自動的に削除されます。単位: YEARMONTHDAYHOURMINUTE。例: 2 MONTHとしてこのプロパティを指定できます。このプロパティはpartition_ttl_numberより推奨されます。v3.1.5以降でサポートされています。

  • partition_ttl_number: 保持する最新のマテリアライズドビューのパーティション数。開始時間が現在の時間より前のパーティションについて、この値を超えると、古いパーティションが削除されます。StarRocksはFE設定項目dynamic_partition_check_interval_secondsで指定された時間間隔に従ってマテリアライズドビューパーティションを定期的にチェックし、期限切れのパーティションを自動的に削除します。動的パーティション化戦略を有効にした場合、事前に作成されたパーティションはカウントされません。値が-1の場合、マテリアライズドビューのすべてのパーティションが保持されます。デフォルト: -1

  • partition_refresh_number: 単一のリフレッシュでリフレッシュする最大パーティション数。リフレッシュするパーティションの数がこの値を超える場合、StarRocksはリフレッシュタスクを分割し、バッチで完了します。前のバッチのパーティションが正常にリフレッシュされると、StarRocksは次のバッチのパーティションをリフレッシュし続け、すべてのパーティションがリフレッシュされるまで続けます。パーティションのいずれかがリフレッシュに失敗した場合、後続のリフレッシュタスクは生成されません。値が-1の場合、リフレッシュタスクは分割されません。デフォルト値はv3.3以降-1から1に変更され、StarRocksはパーティションを1つずつリフレッシュします。

  • partition_refresh_strategy:単一のリフレッシュ操作中のマテリアライズドビューのリフレッシュ戦略。このプロパティが adaptive に設定されている場合、ベーステーブルのパーティション内のデータ量に基づいてリフレッシュするパーティション数が自動的に決定され、リフレッシュ効率が大幅に向上します。このプロパティが指定されていない場合、デフォルト戦略は strict であり、単一の操作でリフレッシュされるパーティション数は partition_refresh_number によって厳密に制御されます。

  • excluded_trigger_tables: マテリアライズドビューのベーステーブルがここにリストされている場合、ベーステーブルのデータが変更されても自動リフレッシュタスクはトリガーされません。このパラメータはロードトリガー型リフレッシュ戦略にのみ適用され、通常はプロパティauto_refresh_partitions_limitと一緒に使用されます。形式: [db_name.]table_name。値が空文字列の場合、すべてのベーステーブルのデータ変更が対応するマテリアライズドビューのリフレッシュをトリガーします。デフォルト値は空文字列です。

  • excluded_refresh_tables: このプロパティにリストされているベーステーブルは、データが変更されてもマテリアライズドビューに更新されません。フォーマット db_name.]table_name。デフォルト値は空文字列です。値が空文字列の場合、ベーステーブルのデータが変更されると、対応するマテリアライズドビューが更新されます。

    ヒント

    excluded_trigger_tablesexcluded_refresh_tables の違いは以下の通りである:

    • excluded_trigger_tables はリフレッシュをトリガーするかどうかを制御するものであり、リフレッシュに参加するかどうかを制御するものではありません。例えば、パーティショニングされたマテリアライズドビューは 2 つのパーティショニングされたテーブル A と B を結合することで得られ、2 つのテーブル A と B のパーティショニングは 1 対 1 に対応します。excluded_trigger_table はテーブル A を含んでいる。ある期間中、テーブル A はパーティション [1,2,3] を更新したが、excluded_trigger_table であるため、マテリアライズドビューのリフレッシュはトリガーされなかった。この時、テーブル B はパーティション [3] を更新し、マテリアライズドビューはリフレッシュをトリガーして、3 つのパーティション [1, 2, 3] をリフレッシュします。ここで、excluded_trigger_table はリフレッシュをトリガーするかどうかを制御するだけであることがわかります。テーブル A の更新がマテリアライズドビューのリフレッシュのトリガーになることはありませんが、テーブル B の更新がマテリアライズドビューのリフレッシュのトリガーになると、テーブルAによって更新されたパーティションもリフレッシュタスクに追加されます。
    • excluded_refresh_tables はリフレッシュに参加するかどうかを制御します。上の例では、テーブル A が excluded_trigger_tableexcluded_refresh_tables の両方に存在する場合、テーブル B の更新がマテリアライズドビューのリフレッシュのトリガーになると、パーティション [3] だけがリフレッシュされます。
  • auto_refresh_partitions_limit: マテリアライズドビューのリフレッシュがトリガーされたときにリフレッシュする必要がある最新のマテリアライズドビューパーティションの数。このプロパティを使用してリフレッシュ範囲を制限し、リフレッシュコストを削減できます。ただし、すべてのパーティションがリフレッシュされないため、マテリアライズドビューのデータがベーステーブルと一致しない場合があります。デフォルト: -1。値が-1の場合、すべてのパーティションがリフレッシュされます。値が正の整数Nの場合、StarRocksは既存のパーティションを時系列順に並べ替え、現在のパーティションとN-1の最新パーティションをリフレッシュします。パーティションの数がN未満の場合、StarRocksはすべての既存のパーティションをリフレッシュします。マテリアライズドビューに事前に作成された動的パーティションがある場合、StarRocksはすべての事前作成されたパーティションをリフレッシュします。

  • mv_rewrite_staleness_second: マテリアライズドビューの最終リフレッシュがこのプロパティで指定された時間間隔内である場合、マテリアライズドビューはクエリの書き換えに直接使用できます。ベーステーブルのデータが変更されているかどうかに関係なく、マテリアライズドビューがクエリの書き換えに使用されるかどうかを決定します。単位: 秒。このプロパティはv3.0からサポートされています。

  • colocate_with: 非同期マテリアライズドビューのコロケーショングループ。詳細については、Colocate Joinを参照してください。このプロパティはv3.0からサポートされています。

  • unique_constraintsおよびforeign_key_constraints: View Delta Joinシナリオでクエリの書き換えを行うために非同期マテリアライズドビューを作成する際のユニークキー制約と外部キー制約。詳細については、非同期マテリアライズドビュー - View Delta Joinシナリオでのクエリの書き換えを参照してください。このプロパティはv3.0からサポートされています。

  • excluded_refresh_tables: このプロパティにリストされているベーステーブルのデータが変更されても、マテリアライズドビューへのデータリフレッシュはトリガーされません。このプロパティは通常、excluded_trigger_tablesプロパティと一緒に使用されます。形式: [db_name.]table_name。デフォルト値は空文字列です。値が空文字列の場合、すべてのベーステーブルのデータ変更が対応するマテリアライズドビューのリフレッシュをトリガーします。

    注意

    ユニークキー制約と外部キー制約はクエリの書き換えにのみ使用されます。外部キー制約のチェックは、テーブルにデータがロードされるときに保証されません。テーブルにロードされるデータが制約を満たしていることを確認する必要があります。

  • resource_group: マテリアライズドビューのリフレッシュタスクが属するリソースグループ。このプロパティのデフォルト値はdefault_mv_wgで、マテリアライズドビューのリフレッシュ専用に使用されるシステム定義のリソースグループです。default_mv_wgcpu_core_limit1mem_limit0.8です。リソースグループの詳細については、リソースグループを参照してください。

  • query_rewrite_consistency: 非同期マテリアライズドビューのクエリの書き換えルール。このプロパティはv3.2からサポートされています。有効な値:

    • disable: 非同期マテリアライズドビューの自動クエリの書き換えを無効にします。

    • checked (デフォルト値): マテリアライズドビューが新鮮さの要件を満たしている場合にのみ自動クエリの書き換えを有効にします。つまり:

      • mv_rewrite_staleness_secondが指定されていない場合、マテリアライズドビューはそのデータがすべてのベーステーブルのデータと一致している場合にのみクエリの書き換えに使用できます。
      • mv_rewrite_staleness_secondが指定されている場合、マテリアライズドビューはその最終リフレッシュが新鮮さの時間間隔内である場合にクエリの書き換えに使用できます。
    • loose: 自動クエリの書き換えを直接有効にし、一貫性のチェックは必要ありません。

    • force_mv: v3.5.0以降、StarRocksマテリアライズドビューは共通パーティション式(Common Partition Expression)TTLをサポートしています。force_mvセマンティクスは、このシナリオ専用に設計されています。このセマンティクスが有効になっている場合:

      • マテリアライズドビューにpartition_retention_conditionプロパティが定義されていない場合、ベーステーブルが更新されているかどうかに関係なく、常にクエリの書き換えに強制的に使用されます。
      • マテリアライズドビューにpartition_retention_conditionプロパティが定義されている場合:
        • TTL範囲内のパーティションについては、ベーステーブルが更新されているかどうかに関係なく、マテリアライズドビューベースのクエリの書き換えが常に利用可能です。
        • TTL範囲外のパーティションについては、ベーステーブルが更新されているかどうかに関係なく、マテリアライズドビューとベーステーブル間のUnion補償が必要です。

      例えば、マテリアライズドビューにpartition_retention_conditionプロパティが定義されており、パーティション20241131が期限切れになっているが、ベーステーブルの20241203データが更新されて作成されているが、マテリアライズドビューの20241203データがまだリフレッシュされていない場合、マテリアライズドビューのquery_rewrite_consistencyforce_mvに定義されている場合:

      • マテリアライズドビューは、TTL範囲内(例えば20241201から20241203の間)でpartition_retention_condition条件に適合するパーティションのクエリが常に透過的に書き換え可能であることを保証します。
      • partition_retention_condition条件に適合しないパーティション上のクエリについては、システムは自動的にマテリアライズドビューとベーステーブルのUnionに基づいて補償を行います。

      共通パーティション式TTLとforce_mvセマンティクスの詳細なガイダンスについては、例6を参照してください。

  • storage_volume: 共有データクラスタを使用している場合、作成する非同期マテリアライズドビューを保存するために使用されるストレージボリュームの名前。このプロパティはv3.1以降でサポートされています。このプロパティが指定されていない場合、デフォルトのストレージボリュームが使用されます。例: "storage_volume" = "def_volume"

  • force_external_table_query_rewrite: 外部カタログベースのマテリアライズドビューのクエリの書き換えを有効にするかどうか。このプロパティはv3.2からサポートされています。有効な値:

    • true(v3.3以降のデフォルト値): 外部カタログベースのマテリアライズドビューのクエリの書き換えを有効にします。
    • false: 外部カタログベースのマテリアライズドビューのクエリの書き換えを無効にします。

    外部カタログベースのマテリアライズドビューとベーステーブル間の強いデータ一貫性は保証されないため、この機能はデフォルトでfalseに設定されています。この機能を有効にすると、query_rewrite_consistencyで指定されたルールに従ってマテリアライズドビューがクエリの書き換えに使用されます。

  • enable_query_rewrite: マテリアライズドビューをクエリの書き換えに使用するかどうか。マテリアライズドビューが多い場合、マテリアライズドビューに基づくクエリの書き換えはオプティマイザの時間消費に影響を与える可能性があります。このプロパティを使用して、マテリアライズドビューがクエリの書き換えに使用できるかどうかを制御できます。この機能はv3.3.0以降でサポートされています。有効な値:

    • default (デフォルト): システムはマテリアライズドビューに対してセマンティックチェックを行いませんが、SPJGタイプのマテリアライズドビューのみがクエリの書き換えに使用できます。テキストベースのクエリの書き換えが有効になっている場合、非SPJGタイプのマテリアライズドビューもクエリの書き換えに使用できます。
    • true: マテリアライズドビューの作成または変更時にシステムがセマンティックチェックを行います。マテリアライズドビューがクエリの書き換えに適していない場合 (つまり、マテリアライズドビューの定義がSPJGタイプのクエリではない場合)、失敗が返されます。
    • false: マテリアライズドビューはクエリの書き換えに使用されません。
  • [プレビュー] transparent_mv_rewrite_mode: マテリアライズドビューに直接対するクエリの透過的な書き換えモードを指定します。この機能はv3.3.0以降でサポートされています。有効な値:

    • false (デフォルト、以前のバージョンの動作と互換性あり): マテリアライズドビューに直接対するクエリは書き換えられず、マテリアライズドビューに存在するデータのみが返されます。これらのクエリの結果は、マテリアライズドビューの定義に基づくクエリの結果と、マテリアライズドビューのリフレッシュ状態 (データの一貫性) に応じて異なる場合があります。
    • true: マテリアライズドビューに直接対するクエリは書き換えられ、マテリアライズドビューの定義クエリの結果と一致する最新のデータが返されます。マテリアライズドビューが非アクティブであるか、透過的なクエリの書き換えをサポートしていない場合、これらのクエリはマテリアライズドビューの定義クエリとして実行されます。
    • transparent_or_error: マテリアライズドビューに直接対するクエリは、適格であれば書き換えられます。マテリアライズドビューが非アクティブであるか、透過的なクエリの書き換えをサポートしていない場合、これらのクエリはエラーとして返されます。
    • transparent_or_default: マテリアライズドビューに直接対するクエリは、適格であれば書き換えられます。マテリアライズドビューが非アクティブであるか、透過的なクエリの書き換えをサポートしていない場合、これらのクエリはマテリアライズドビューに存在するデータで返されます。
  • partition_retention_condition: v3.5.0以降、StarRocksマテリアライズドビューは共通パーティション式(Common Partition Expression)TTLをサポートしています。このプロパティは、動的に保持するパーティションを宣言する式です。式内の条件を満たさないパーティションは定期的に削除されます。例: "partition_retention_condition" = "dt >= CURRENT_DATE() - INTERVAL 3 MONTH"

    • 式にはパーティション列と定数のみを含めることができます。非パーティション列はサポートされていません。
    • 共通パーティション式は、ListパーティションとRangeパーティションに対して異なる方法で処理されます:
      • Listパーティションのマテリアライズドビューについては、StarRocksは共通パーティション式でフィルタリングされたパーティションの削除をサポートしています。
      • Rangeパーティションのマテリアライズドビューについては、StarRocksはFEのパーティション剪定機能を使用してパーティションをフィルタリングおよび削除することのみができます。パーティション剪定でサポートされていない述語に対応するパーティションは、フィルタリングおよび削除できません。

    共通パーティション式TTLとforce_mvセマンティクスの詳細なガイダンスについては、例6を参照してください。

  • refresh_mode: マテリアライズドビューの更新方法を制御します。StarRocks v4.1 で導入されました。有効な値:

    • PCT: (デフォルト)パーティション化されたマテリアライズドビューの場合、ベーステーブルにデータの変更があると影響を受けたパーティションのみリフレッシュされ、そのパーティションの結果の一貫性が保証されます。パーティション化されていないマテリアライズドビューの場合、ベーステーブルのいずれかが変更されるとマテリアライズドビュー全体がフルリフレッシュされます。
    • AUTO: 可能な限り増分リフレッシュを試みます。マテリアライズドビューのクエリ定義が増分リフレッシュをサポートしていない場合、その操作について自動的にPCTモードへフォールバックします。PCTリフレッシュの後、条件が整えば次回以降は再び増分リフレッシュに戻る場合もあります。
    • INCREMENTAL: 増分リフレッシュのみを行うことを保証します。マテリアライズドビューの定義で増分リフレッシュがサポートされていない場合や、非増分データに遭遇した場合、作成やリフレッシュが失敗します。
    • FULL: マテリアライズドビューが増分やパーティション単位のリフレッシュをサポートしているかどうかに関係なく、毎回全データのフルリフレッシュを強制します。

query_statement (必須)

非同期マテリアライズドビューを作成するためのクエリステートメント。v3.1.6以降、StarRocksはCommon Table Expression (CTE)を使用した非同期マテリアライズドビューの作成をサポートしています。

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

非同期マテリアライズドビューは物理テーブルです。通常のテーブルと同様に操作できますが、非同期マテリアライズドビューに直接データをロードすることはできません

非同期マテリアライズドビューによる自動クエリの書き換え

StarRocks v2.5は、SPJGタイプの非同期マテリアライズドビューに基づく自動かつ透過的なクエリの書き換えをサポートしています。SPJGタイプのマテリアライズドビューは、プランにScan、Filter、Project、Aggregateタイプのオペレーターのみを含むマテリアライズドビューを指します。SPJGタイプのマテリアライズドビューのクエリの書き換えには、単一テーブルのクエリの書き換え、ジョインクエリの書き換え、集計クエリの書き換え、ユニオンクエリの書き換え、およびネストされたマテリアライズドビューに基づくクエリの書き換えが含まれます。

詳細については、非同期マテリアライズドビュー - 非同期マテリアライズドビューを使用したクエリの書き換えを参照してください。

サポートされているデータ型

  • StarRocksのデフォルトカタログに基づいて作成された非同期マテリアライズドビューは、次のデータ型をサポートしています:

    • 日付: DATE, DATETIME
    • 文字列: CHAR, VARCHAR
    • 数値: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, PERCENTILE
    • 半構造化: ARRAY, JSON, MAP (v3.1以降), STRUCT (v3.1以降)
    • その他: BITMAP, HLL

注意

BITMAP, HLL, PERCENTILEはv2.4.5以降でサポートされています。

  • StarRocksの外部カタログに基づいて作成された非同期マテリアライズドビューは、次のデータ型をサポートしています:

    • Hive Catalog

      • 数値: INT/INTEGER, BIGINT, DOUBLE, FLOAT, DECIMAL
      • 日付: TIMESTAMP
      • 文字列: STRING, VARCHAR, CHAR
      • 半構造化: ARRAY
    • Hudi Catalog

      • 数値: BOOLEAN, INT, LONG, FLOAT, DOUBLE, DECIMAL
      • 日付: DATE, TimeMillis/TimeMicros, TimestampMillis/TimestampMicros
      • 文字列: STRING
      • 半構造化: ARRAY
    • Iceberg Catalog

      • 数値: BOOLEAN, INT, LONG, FLOAT, DOUBLE, DECIMAL(P, S)
      • 日付: DATE, TIME, TIMESTAMP
      • 文字列: STRING, UUID, FIXED(L), BINARY
      • 半構造化: LIST

使用上の注意

  • 現在のバージョンのStarRocksは、同時に複数のマテリアライズドビューを作成することをサポートしていません。新しいマテリアライズドビューは、前のものが完了したときにのみ作成できます。

  • 同期マテリアライズドビューについて:

    • 同期マテリアライズドビューは、単一の列に対する集計関数のみをサポートします。sum(a+b)の形式のクエリステートメントはサポートされていません。
    • 同期マテリアライズドビューは、ベーステーブルの各列に対して1つの集計関数のみをサポートします。select sum(a), min(a) from tableのようなクエリステートメントはサポートされていません。
    • 集計関数を持つ同期マテリアライズドビューを作成する場合、GROUP BY句を指定し、SELECTで少なくとも1つのGROUP BY列を指定する必要があります。
    • 同期マテリアライズドビューは、JOINやGROUP BYのHAVING句などの句をサポートしていません。
    • ALTER TABLE DROP COLUMNを使用してベーステーブルの特定の列を削除する場合、ベーステーブルのすべての同期マテリアライズドビューに削除された列が含まれていないことを確認する必要があります。そうでない場合、削除操作は失敗します。列を削除する前に、その列を含むすべての同期マテリアライズドビューを削除する必要があります。
    • テーブルに対して同期マテリアライズドビューを作成しすぎると、データロードの効率に影響を与えます。ベーステーブルにデータがロードされるとき、同期マテリアライズドビューとベーステーブルのデータが同期的に更新されます。ベーステーブルにn個の同期マテリアライズドビューが含まれている場合、ベーステーブルにデータをロードする効率はn個のテーブルにデータをロードする効率とほぼ同じです。
  • ネストされた非同期マテリアライズドビューについて:

    • 各マテリアライズドビューのリフレッシュ戦略は、対応するマテリアライズドビューにのみ適用されます。
    • 現在、StarRocksはネストのレベル数を制限していません。実稼働環境では、ネストのレイヤー数が3を超えないことをお勧めします。
  • 外部カタログ非同期マテリアライズドビューについて:

    • 外部カタログマテリアライズドビューは、非同期固定間隔リフレッシュと手動リフレッシュのみをサポートします。
    • 外部カタログ内のマテリアライズドビューとベーステーブル間の厳密な一貫性は保証されません。
    • 現在、外部リソースに基づくマテリアライズドビューの構築はサポートされていません。
    • 現在、StarRocksは外部カタログ内のベーステーブルデータが変更されたかどうかを認識できないため、ベーステーブルがリフレッシュされるたびにすべてのパーティションがデフォルトでリフレッシュされます。REFRESH MATERIALIZED VIEWを使用して、一部のパーティションのみを手動でリフレッシュできます。

インクリメンタルマテリアライズドビュー

StarRocks v4.1 では、マテリアライズドビューのリフレッシュ動作を制御するための refresh_mode パラメータが導入されました。各MVの作成時に refresh_mode を指定できます。作成時に refresh_mode を設定しない場合、システムは Config.default_mv_refresh_mode パラメータ(デフォルト:pct)で制御される既定値を使用します。以下の運用指針にご注意ください。

  • refresh_mode を調整する際には次の制限があります:
    • レガシーなマテリアライズドビュー(たとえばPCT型など)をAUTOまたはINCREMENTAL更新モードで使用するように変更することはできません。変更するには、マテリアライズドビューを再構築する必要があります。
    • マテリアライズドビューを AUTO または INCREMENTAL タイプから変更する場合、システムは増分更新が可能かどうかを確認します。不可能な場合、操作は失敗します。
  • インクリメンタルマテリアライズドビューはパーティションリフレッシュの指定をサポートしません:
    • INCREMENTAL 方式のマテリアライズドビューでは、パーティションの更新を試みると例外が発生します。
    • AUTOマテリアライズドビューの場合、StarRocksはリフレッシュ操作時に自動的にPCTモードに切り替わります。

対応しているインクリメンタル演算子

インクリメンタルリフレッシュは、ベーステーブルへの追記(append-only)操作のみをサポートします。UPDATEMERGEOVERWRITEなどの非対応操作が行われた場合:

  • refresh_modeINCREMENTAL だと、マテリアライズドビューのリフレッシュは失敗します。
  • refresh_modeAUTO だと、システムは自動的にリフレッシュモードを PCT にフォールバックします。

現在、インクリメンタルリフレッシュでサポートされている演算子は以下の通りです:

演算子インクリメンタルリフレッシュのサポート
Selectサポート済み
From <Table>Iceberg/Paimon テーブルのみサポート;その他のテーブルタイプは未対応
Filterサポート済み
Group By付き集約サポート済み
  • distinctを伴う集約関数は未対応
  • GROUP BYなし集約も未対応
Inner Joinサポート済み
Union Allサポート済み
Left/Right/Full Outer Joinまだサポートされていません
注記
  • 上述の各演算子は一般的にインクリメンタルリフレッシュをサポートしますが、組み合わせによる制約があります:
    • join後の集約や、union後の集約に対してはインクリメンタル計算がサポートされています。
    • 一方で、集約後にjoinや、集約後のunion allについてはインクリメンタル計算はサポートされていません

CREATE MATERIALIZED VIEW test_mv1 PARTITION BY dt 
REFRESH DEFERRED MANUAL
properties
(
"refresh_mode" = "INCREMENTAL"
)
AS SELECT
t1.dt, t1.col1 as col11, t2.col1 as col21, t3.col1 as col31, t4.col1 as col41, t5.col1 as col51,
sum(t1.col2) as col12, sum(t2.col2) as col22, sum(t3.col2) as col32, sum(t4.col2) as col42, sum(t5.col2) as col52,
avg(t1.col2) as col13, avg(t2.col2) as col23, avg(t3.col2) as col33, avg(t4.col2) as col43, avg(t5.col2) as col53,
min(t1.col2) as col14, min(t2.col2) as col24, min(t3.col2) as col34, min(t4.col2) as col44, min(t5.col2) as col54,
max(t1.col2) as col15, max(t2.col2) as col25, max(t3.col2) as col35, max(t4.col2) as col45, max(t5.col2) as col55,
count(t1.col2) as col16, count(t2.col2) as col26, count(t3.col2) as col36, count(t4.col2) as col46, count(t5.col2) as col56,
approx_count_distinct(t1.col2) as col17, approx_count_distinct(t2.col2) as col27, approx_count_distinct(t3.col2) as col37, approx_count_distinct(t4.col2) as col47, approx_count_distinct(t5.col2) as col57
FROM
iceberg_catalog.iceberg_test_dbt1
JOIN iceberg_catalog.iceberg_test_dbt2 ON t1.dt = t2.dt
JOIN iceberg_catalog.iceberg_test_dbt3 ON t1.dt = t3.dt
JOIN iceberg_catalog.iceberg_test_dbt4 ON t1.dt = t4.dt
JOIN iceberg_catalog.iceberg_test_dbt5 ON t1.dt = t5.dt
GROUP BY t1.dt, t1.col1, t2.col1, t3.col1, t4.col1, t5.col1;

REFRESH MATERIALIZED VIEW test_mv1 WITH SYNC MODE;

information_schema.task_runsEXTRA_MESSAGE カラムに refreshMode フィールドが追加され、TaskRun のリフレッシュモードが示されるようになっています。より詳細については materialized_view_task_run_details を参照してください。

mysql> select * from information_schema.task_runs order by CREATE_TIME desc limit 1\G;
QUERY_ID: 0199f00e-2152-70a8-83da-26d6a8321ac6
TASK_NAME: mv-78190
CREATE_TIME: 2025-10-17 10:44:41
FINISH_TIME: 2025-10-17 10:44:44
STATE: SUCCESS
CATALOG: NULL
DATABASE: test_mv_async_db_621c29ff_ab02_11f0_9e41_00163e09349d
DEFINITION: insert overwrite `test_mv_case_iceberg_transform_day_44` SELECT `t1`.`id`, `t1`.`v1`, `t1`.`v2`, `t1`.`dt` FROM `iceberg_catalog_621c2b62_ab02_11f0_a703_00163e09349d`.`iceberg_db_621c2bc9_ab02_11f0_885d_00163e09349d`.`t1` WHERE (`t1`.`id` > 1) AND (`t1`.`dt` >= '2025-06-01')
EXPIRE_TIME: 2025-10-24 10:44:41
ERROR_CODE: 0
ERROR_MESSAGE: NULL
PROGRESS: 100%
EXTRA_MESSAGE: {"forceRefresh":false,"mvPartitionsToRefresh":["p20250718000000","p20250715000000","p20250721000000","p20250615000000","p20250618000000","p20250524000000","p20250621000000","p20250518000000"],"refBasePartitionsToRefreshMap":{"t1":["p20250718000000","p20250721000000","p20250618000000","p20250524000000","p20250621000000","p20250518000000","p20250715000000","p20250615000000","pNULL","p20250521000000","p20250624000000","p20250724000000","p20250515000000"]},"basePartitionsToRefreshMap":{},"processStartTime":1760669082430,"executeOption":{"priority":80,"taskRunProperties":{"FORCE":"false","mvId":"78190","warehouse":"default_warehouse"},"isMergeRedundant":false,"isManual":true,"isSync":true,"isReplay":false},"planBuilderMessage":{},"refreshMode":"INCREMENTAL"}
PROPERTIES: {"FORCE":"false","mvId":"78190","warehouse":"default_warehouse"}
JOB_ID: 0199f00e-2152-76b0-987c-76a9a19e77f9

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

ベーステーブルのスキーマは次のとおりです。

mysql> desc duplicate_table;
+-------+--------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+------+---------+-------+
| k1 | INT | Yes | true | N/A | |
| k2 | INT | Yes | true | N/A | |
| k3 | BIGINT | Yes | true | N/A | |
| k4 | BIGINT | Yes | true | N/A | |
+-------+--------+------+------+---------+-------+

例1: 元のテーブルの列 (k1, k2) のみを含む同期マテリアライズドビューを作成します。

create materialized view k1_k2 as
select k1, k2 from duplicate_table;

マテリアライズドビューには、集計なしで2つの列k1とk2のみが含まれます。

+-----------------+-------+--------+------+------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+------+---------+-------+
| k1_k2 | k1 | INT | Yes | true | N/A | |
| | k2 | INT | Yes | true | N/A | |
+-----------------+-------+--------+------+------+---------+-------+

例2: k2でソートされた同期マテリアライズドビューを作成します。

create materialized view k2_order as
select k2, k1 from duplicate_table order by k2;

マテリアライズドビューのスキーマは以下の通りです。マテリアライズドビューには、集計なしで2つの列k2とk1が含まれ、列k2はソート列です。

+-----------------+-------+--------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+-------+---------+-------+
| k2_order | k2 | INT | Yes | true | N/A | |
| | k1 | INT | Yes | false | N/A | NONE |
+-----------------+-------+--------+------+-------+---------+-------+

例3: k1とk2でグループ化し、k3に対してSUM集計を行う同期マテリアライズドビューを作成します。

create materialized view k1_k2_sumk3 as
select k1, k2, sum(k3) from duplicate_table group by k1, k2;

マテリアライズドビューのスキーマは以下の通りです。マテリアライズドビューには、グループ化された列k1、k2と、k1とk2に基づいてグループ化されたk3列の合計であるsum (k3)が含まれます。

+-----------------+-------+--------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+-------+---------+-------+
| k1_k2_sumk3 | k1 | INT | Yes | true | N/A | |
| | k2 | INT | Yes | true | N/A | |
| | k3 | BIGINT | Yes | false | N/A | SUM |
+-----------------+-------+--------+------+-------+---------+-------+

マテリアライズドビューはソート列を宣言していないため、StarRocksはデフォルトでグループ化された列k1とk2を補完します。

例4: 重複行を削除する同期マテリアライズドビューを作成します。

create materialized view deduplicate as
select k1, k2, k3, k4 from duplicate_table group by k1, k2, k3, k4;

マテリアライズドビューのスキーマは以下の通りです。マテリアライズドビューには、重複行のないk1、k2、k3、k4列が含まれます。

+-----------------+-------+--------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+-------+---------+-------+
| deduplicate | k1 | INT | Yes | true | N/A | |
| | k2 | INT | Yes | true | N/A | |
| | k3 | BIGINT | Yes | true | N/A | |
| | k4 | BIGINT | Yes | true | N/A | |
+-----------------+-------+--------+------+-------+---------+-------+

例5: ソート列を宣言しない非集計同期マテリアライズドビューを作成します。

ベーステーブルのスキーマは以下の通りです。

+-------+--------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-------+---------+-------+
| k1 | TINYINT | Yes | true | N/A | |
| k2 | SMALLINT | Yes | true | N/A | |
| k3 | INT | Yes | true | N/A | |
| k4 | BIGINT | Yes | true | N/A | |
| k5 | DECIMAL(9,0) | Yes | true | N/A | |
| k6 | DOUBLE | Yes | false | N/A | NONE |
| k7 | VARCHAR(20) | Yes | false | N/A | NONE |
+-------+--------------+------+-------+---------+-------+

マテリアライズドビューには、k3、k4、k5、k6、k7列が含まれ、ソート列は宣言されていません。次のステートメントでマテリアライズドビューを作成します。

create materialized view mv_1 as
select k3, k4, k5, k6, k7 from all_type_table;

StarRocksはデフォルトでk3、k4、k5をソート列として自動的に使用します。これら3つの列タイプが占めるバイト数の合計は4 (INT) + 8 (BIGINT) + 16 (DECIMAL) = 28 < 36です。したがって、これら3つの列がソート列として追加されます。

マテリアライズドビューのスキーマは以下の通りです。

+----------------+-------+--------------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+----------------+-------+--------------+------+-------+---------+-------+
| mv_1 | k3 | INT | Yes | true | N/A | |
| | k4 | BIGINT | Yes | true | N/A | |
| | k5 | DECIMAL(9,0) | Yes | true | N/A | |
| | k6 | DOUBLE | Yes | false | N/A | NONE |
| | k7 | VARCHAR(20) | Yes | false | N/A | NONE |
+----------------+-------+--------------+------+-------+---------+-------+

k3、k4、k5列のkeyフィールドがtrueであることが観察され、これらがソートキーであることを示しています。k6、k7列のkeyフィールドはfalseであり、これらがソートキーではないことを示しています。

例6: WHERE句と複雑な式を含む同期マテリアライズドビューを作成します。

-- ベーステーブル: user_eventを作成
CREATE TABLE user_event (
ds date NOT NULL,
id varchar(256) NOT NULL,
user_id int DEFAULT NULL,
user_id1 varchar(256) DEFAULT NULL,
user_id2 varchar(256) DEFAULT NULL,
column_01 int DEFAULT NULL,
column_02 int DEFAULT NULL,
column_03 int DEFAULT NULL,
column_04 int DEFAULT NULL,
column_05 int DEFAULT NULL,
column_06 DECIMAL(12,2) DEFAULT NULL,
column_07 DECIMAL(12,3) DEFAULT NULL,
column_08 JSON DEFAULT NULL,
column_09 DATETIME DEFAULT NULL,
column_10 DATETIME DEFAULT NULL,
column_11 DATE DEFAULT NULL,
column_12 varchar(256) DEFAULT NULL,
column_13 varchar(256) DEFAULT NULL,
column_14 varchar(256) DEFAULT NULL,
column_15 varchar(256) DEFAULT NULL,
column_16 varchar(256) DEFAULT NULL,
column_17 varchar(256) DEFAULT NULL,
column_18 varchar(256) DEFAULT NULL,
column_19 varchar(256) DEFAULT NULL,
column_20 varchar(256) DEFAULT NULL,
column_21 varchar(256) DEFAULT NULL,
column_22 varchar(256) DEFAULT NULL,
column_23 varchar(256) DEFAULT NULL,
column_24 varchar(256) DEFAULT NULL,
column_25 varchar(256) DEFAULT NULL,
column_26 varchar(256) DEFAULT NULL,
column_27 varchar(256) DEFAULT NULL,
column_28 varchar(256) DEFAULT NULL,
column_29 varchar(256) DEFAULT NULL,
column_30 varchar(256) DEFAULT NULL,
column_31 varchar(256) DEFAULT NULL,
column_32 varchar(256) DEFAULT NULL,
column_33 varchar(256) DEFAULT NULL,
column_34 varchar(256) DEFAULT NULL,
column_35 varchar(256) DEFAULT NULL,
column_36 varchar(256) DEFAULT NULL,
column_37 varchar(256) DEFAULT NULL
)
PARTITION BY date_trunc("day", ds)
DISTRIBUTED BY hash(id);

-- WHERE句と複雑な式を含むマテリアライズドビューを作成
CREATE MATERIALIZED VIEW test_mv1
AS
SELECT
ds,
column_19,
column_36,
sum(column_01) as column_01_sum,
bitmap_union(to_bitmap( user_id)) as user_id_dist_cnt,
bitmap_union(to_bitmap(case when column_01 > 1 and column_34 IN ('1','34') then user_id2 else null end)) as filter_dist_cnt_1,
bitmap_union(to_bitmap( case when column_02 > 60 and column_35 IN ('11','13') then user_id2 else null end)) as filter_dist_cnt_2,
bitmap_union(to_bitmap(case when column_03 > 70 and column_36 IN ('21','23') then user_id2 else null end)) as filter_dist_cnt_3,
bitmap_union(to_bitmap(case when column_04 > 20 and column_27 IN ('31','27') then user_id2 else null end)) as filter_dist_cnt_4,
bitmap_union(to_bitmap( case when column_05 > 90 and column_28 IN ('41','43') then user_id2 else null end)) as filter_dist_cnt_5
FROM user_event
WHERE ds >= '2023-11-02'
GROUP BY
ds,
column_19,
column_36;

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

以下の例は、以下のベーステーブルに基づいています。

CREATE TABLE `lineorder` (
`lo_orderkey` int(11) NOT NULL COMMENT "",
`lo_linenumber` int(11) NOT NULL COMMENT "",
`lo_custkey` int(11) NOT NULL COMMENT "",
`lo_partkey` int(11) NOT NULL COMMENT "",
`lo_suppkey` int(11) NOT NULL COMMENT "",
`lo_orderdate` int(11) NOT NULL COMMENT "",
`lo_orderpriority` varchar(16) NOT NULL COMMENT "",
`lo_shippriority` int(11) NOT NULL COMMENT "",
`lo_quantity` int(11) NOT NULL COMMENT "",
`lo_extendedprice` int(11) NOT NULL COMMENT "",
`lo_ordtotalprice` int(11) NOT NULL COMMENT "",
`lo_discount` int(11) NOT NULL COMMENT "",
`lo_revenue` int(11) NOT NULL COMMENT "",
`lo_supplycost` int(11) NOT NULL COMMENT "",
`lo_tax` int(11) NOT NULL COMMENT "",
`lo_commitdate` int(11) NOT NULL COMMENT "",
`lo_shipmode` varchar(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`lo_orderkey`)
COMMENT "OLAP"
PARTITION BY RANGE(`lo_orderdate`)
(PARTITION p1 VALUES [("-2147483648"), ("19930101")),
PARTITION p2 VALUES [("19930101"), ("19940101")),
PARTITION p3 VALUES [("19940101"), ("19950101")),
PARTITION p4 VALUES [("19950101"), ("19960101")),
PARTITION p5 VALUES [("19960101"), ("19970101")),
PARTITION p6 VALUES [("19970101"), ("19980101")),
PARTITION p7 VALUES [("19980101"), ("19990101")))
DISTRIBUTED BY HASH(`lo_orderkey`);

CREATE TABLE IF NOT EXISTS `customer` (
`c_custkey` int(11) NOT NULL COMMENT "",
`c_name` varchar(26) NOT NULL COMMENT "",
`c_address` varchar(41) NOT NULL COMMENT "",
`c_city` varchar(11) NOT NULL COMMENT "",
`c_nation` varchar(16) NOT NULL COMMENT "",
`c_region` varchar(13) NOT NULL COMMENT "",
`c_phone` varchar(16) NOT NULL COMMENT "",
`c_mktsegment` varchar(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`c_custkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`c_custkey`);

CREATE TABLE IF NOT EXISTS `dates` (
`d_datekey` int(11) NOT NULL COMMENT "",
`d_date` varchar(20) NOT NULL COMMENT "",
`d_dayofweek` varchar(10) NOT NULL COMMENT "",
`d_month` varchar(11) NOT NULL COMMENT "",
`d_year` int(11) NOT NULL COMMENT "",
`d_yearmonthnum` int(11) NOT NULL COMMENT "",
`d_yearmonth` varchar(9) NOT NULL COMMENT "",
`d_daynuminweek` int(11) NOT NULL COMMENT "",
`d_daynuminmonth` int(11) NOT NULL COMMENT "",
`d_daynuminyear` int(11) NOT NULL COMMENT "",
`d_monthnuminyear` int(11) NOT NULL COMMENT "",
`d_weeknuminyear` int(11) NOT NULL COMMENT "",
`d_sellingseason` varchar(14) NOT NULL COMMENT "",
`d_lastdayinweekfl` int(11) NOT NULL COMMENT "",
`d_lastdayinmonthfl` int(11) NOT NULL COMMENT "",
`d_holidayfl` int(11) NOT NULL COMMENT "",
`d_weekdayfl` int(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`d_datekey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`d_datekey`);

CREATE TABLE IF NOT EXISTS `supplier` (
`s_suppkey` int(11) NOT NULL COMMENT "",
`s_name` varchar(26) NOT NULL COMMENT "",
`s_address` varchar(26) NOT NULL COMMENT "",
`s_city` varchar(11) NOT NULL COMMENT "",
`s_nation` varchar(16) NOT NULL COMMENT "",
`s_region` varchar(13) NOT NULL COMMENT "",
`s_phone` varchar(16) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`s_suppkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`s_suppkey`);

CREATE TABLE IF NOT EXISTS `part` (
`p_partkey` int(11) NOT NULL COMMENT "",
`p_name` varchar(23) NOT NULL COMMENT "",
`p_mfgr` varchar(7) NOT NULL COMMENT "",
`p_category` varchar(8) NOT NULL COMMENT "",
`p_brand` varchar(10) NOT NULL COMMENT "",
`p_color` varchar(12) NOT NULL COMMENT "",
`p_type` varchar(26) NOT NULL COMMENT "",
`p_size` int(11) NOT NULL COMMENT "",
`p_container` varchar(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`p_partkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`p_partkey`);

create table orders (
dt date NOT NULL,
order_id bigint NOT NULL,
user_id int NOT NULL,
merchant_id int NOT NULL,
good_id int NOT NULL,
good_name string NOT NULL,
price int NOT NULL,
cnt int NOT NULL,
revenue int NOT NULL,
state tinyint NOT NULL
)
PRIMARY KEY (dt, order_id)
PARTITION BY RANGE(`dt`)
( PARTITION p20210820 VALUES [('2021-08-20'), ('2021-08-21')),
PARTITION p20210821 VALUES [('2021-08-21'), ('2021-08-22')) )
DISTRIBUTED BY HASH(order_id)
PROPERTIES (
"replication_num" = "3",
"enable_persistent_index" = "true"
);

例1: 非パーティション化されたマテリアライズドビューを作成します。

-- lo_custkeyでソートされた非パーティション化されたマテリアライズドビューを作成
CREATE MATERIALIZED VIEW lo_mv1
DISTRIBUTED BY HASH(`lo_orderkey`)
ORDER BY `lo_custkey`
REFRESH ASYNC
AS
select
lo_orderkey,
lo_custkey,
sum(lo_quantity) as total_quantity,
sum(lo_revenue) as total_revenue,
count(lo_shipmode) as shipmode_count
from lineorder
group by lo_orderkey, lo_custkey

例2: パーティション化されたマテリアライズドビューを作成します。

-- `lo_orderdate`でパーティション化され、`lo_custkey`でソートされたパーティション化されたマテリアライズドビューを作成
CREATE MATERIALIZED VIEW lo_mv2
PARTITION BY `lo_orderdate`
DISTRIBUTED BY HASH(`lo_orderkey`)
ORDER BY `lo_custkey`
REFRESH ASYNC START('2023-07-01 10:00:00') EVERY (interval 1 day)
AS
select
lo_orderkey,
lo_orderdate,
lo_custkey,
sum(lo_quantity) as total_quantity,
sum(lo_revenue) as total_revenue,
count(lo_shipmode) as shipmode_count
from lineorder
group by lo_orderkey, lo_orderdate, lo_custkey;

-- date_trunc()関数を使用して、マテリアライズドビューを月単位でパーティション化します。 CREATE MATERIALIZED VIEW order_mv1 PARTITION BY date_trunc('month', dt) DISTRIBUTED BY HASH(order_id) REFRESH ASYNC START('2023-07-01 10:00:00') EVERY (interval 1 day) AS select dt, order_id, user_id, sum(cnt) as total_cnt, sum(revenue) as total_revenue, count(state) as state_count from orders group by dt, order_id, user_id;


例3: 非同期マテリアライズドビューを作成します。

```SQL
CREATE MATERIALIZED VIEW flat_lineorder
DISTRIBUTED BY HASH(`lo_orderkey`)
REFRESH MANUAL
AS
SELECT
l.LO_ORDERKEY AS LO_ORDERKEY,
l.LO_LINENUMBER AS LO_LINENUMBER,
l.LO_CUSTKEY AS LO_CUSTKEY,
l.LO_PARTKEY AS LO_PARTKEY,
l.LO_SUPPKEY AS LO_SUPPKEY,
l.LO_ORDERDATE AS LO_ORDERDATE,
l.LO_ORDERPRIORITY AS LO_ORDERPRIORITY,
l.LO_SHIPPRIORITY AS LO_SHIPPRIORITY,
l.LO_QUANTITY AS LO_QUANTITY,
l.LO_EXTENDEDPRICE AS LO_EXTENDEDPRICE,
l.LO_ORDTOTALPRICE AS LO_ORDTOTALPRICE,
l.LO_DISCOUNT AS LO_DISCOUNT,
l.LO_REVENUE AS LO_REVENUE,
l.LO_SUPPLYCOST AS LO_SUPPLYCOST,
l.LO_TAX AS LO_TAX,
l.LO_COMMITDATE AS LO_COMMITDATE,
l.LO_SHIPMODE AS LO_SHIPMODE,
c.C_NAME AS C_NAME,
c.C_ADDRESS AS C_ADDRESS,
c.C_CITY AS C_CITY,
c.C_NATION AS C_NATION,
c.C_REGION AS C_REGION,
c.C_PHONE AS C_PHONE,
c.C_MKTSEGMENT AS C_MKTSEGMENT,
s.S_NAME AS S_NAME,
s.S_ADDRESS AS S_ADDRESS,
s.S_CITY AS S_CITY,
s.S_NATION AS S_NATION,
s.S_REGION AS S_REGION,
s.S_PHONE AS S_PHONE,
p.P_NAME AS P_NAME,
p.P_MFGR AS P_MFGR,
p.P_CATEGORY AS P_CATEGORY,
p.P_BRAND AS P_BRAND,
p.P_COLOR AS P_COLOR,
p.P_TYPE AS P_TYPE,
p.P_SIZE AS P_SIZE,
p.P_CONTAINER AS P_CONTAINER FROM lineorder AS l
INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY
INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY
INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY;

例4: パーティション化されたマテリアライズドビューを作成し、str2dateを使用してベーステーブルのSTRING型パーティションキーをマテリアライズドビューのDATE型に変換します。


-- 文字列パーティション列を持つHiveテーブル。
CREATE TABLE `part_dates` (
`d_date` varchar(20) DEFAULT NULL,
`d_dayofweek` varchar(10) DEFAULT NULL,
`d_month` varchar(11) DEFAULT NULL,
`d_year` int(11) DEFAULT NULL,
`d_yearmonthnum` int(11) DEFAULT NULL,
`d_yearmonth` varchar(9) DEFAULT NULL,
`d_daynuminweek` int(11) DEFAULT NULL,
`d_daynuminmonth` int(11) DEFAULT NULL,
`d_daynuminyear` int(11) DEFAULT NULL,
`d_monthnuminyear` int(11) DEFAULT NULL,
`d_weeknuminyear` int(11) DEFAULT NULL,
`d_sellingseason` varchar(14) DEFAULT NULL,
`d_lastdayinweekfl` int(11) DEFAULT NULL,
`d_lastdayinmonthfl` int(11) DEFAULT NULL,
`d_holidayfl` int(11) DEFAULT NULL,
`d_weekdayfl` int(11) DEFAULT NULL,
`d_datekey` varchar(11) DEFAULT NULL
) partition by (d_datekey);


-- `str2date`を使用してマテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW IF NOT EXISTS `test_mv`
PARTITION BY str2date(`d_datekey`,'%Y%m%d')
DISTRIBUTED BY HASH(`d_date`, `d_month`, `d_month`)
REFRESH MANUAL
AS
SELECT
`d_date` ,
`d_dayofweek`,
`d_month` ,
`d_yearmonthnum` ,
`d_yearmonth` ,
`d_daynuminweek`,
`d_daynuminmonth`,
`d_daynuminyear` ,
`d_monthnuminyear` ,
`d_weeknuminyear` ,
`d_sellingseason`,
`d_lastdayinweekfl`,
`d_lastdayinmonthfl`,
`d_holidayfl` ,
`d_weekdayfl`,
`d_datekey`
FROM
`hive_catalog`.`ssb_1g_orc`.`part_dates` ;

例5: 複数列パーティション式を使用してIceberg Catalog(Spark)のベーステーブルに基づいてパーティション化されたマテリアライズドビューを作成します。

Sparkでのベーステーブルの定義は以下の通りです:

-- パーティション式には複数のパーティション列と`days` Transformが含まれています。
CREATE TABLE lineitem_days (
l_orderkey BIGINT,
l_partkey INT,
l_suppkey INT,
l_linenumber INT,
l_quantity DECIMAL(15, 2),
l_extendedprice DECIMAL(15, 2),
l_discount DECIMAL(15, 2),
l_tax DECIMAL(15, 2),
l_returnflag VARCHAR(1),
l_linestatus VARCHAR(1),
l_shipdate TIMESTAMP,
l_commitdate TIMESTAMP,
l_receiptdate TIMESTAMP,
l_shipinstruct VARCHAR(25),
l_shipmode VARCHAR(10),
l_comment VARCHAR(44)
) USING ICEBERG
PARTITIONED BY (l_returnflag, l_linestatus, days(l_shipdate));

複数列パーティション1対1マッピングマテリアライズドビューを作成します:

CREATE MATERIALIZED VIEW test_days
PARTITION BY (l_returnflag, l_linestatus, date_trunc('day', l_shipdate))
REFRESH DEFERRED MANUAL
AS
SELECT * FROM iceberg_catalog.test_db.lineitem_days;

例6: 共通パーティション式TTLを指定し、force_mvクエリの書き換えセマンティクスを有効にしてパーティション化されたマテリアライズドビューを作成します。

CREATE MATERIALIZED VIEW test_mv1 
PARTITION BY (dt, province)
REFRESH MANUAL
PROPERTIES (
"partition_retention_condition" = "dt >= CURRENT_DATE() - INTERVAL 3 MONTH",
"query_rewrite_consistency" = "force_mv"
)
AS SELECT * from t1;

例7: 特定のソートキーを持つパーティション化されたマテリアライズドビューを作成します:

CREATE MATERIALIZED VIEW lo_mv2
PARTITION BY `lo_orderdate`
DISTRIBUTED BY HASH(`lo_orderkey`)
ORDER BY `lo_custkey`
REFRESH ASYNC START('2023-07-01 10:00:00') EVERY (interval 1 day)
AS
select
lo_orderkey,
lo_orderdate,
lo_custkey,
sum(lo_quantity) as total_quantity,
sum(lo_revenue) as total_revenue,
count(lo_shipmode) as shipmode_count
from lineorder
group by lo_orderkey, lo_orderdate, lo_custkey;
Rocky the happy otterStarRocks Assistant

AI generated answers are based on docs and other sources. Please test answers in non-production environments.