CREATE MATERIALIZED VIEW
説明
マテリアライズドビューを作成します。マテリアライズドビューの使用方法について は、同期マテリアライズドビューおよび非同期マテリアライズドビューを参照してください。
注意
- ベーステーブルが存在するデータベースでCREATE MATERIALIZED VIEW権限を持つユーザーのみがマテリアライズドビューを作成できます。
- v3.4.0以降、StarRocksは共有データクラスタでの同期マテリアライズドビューの作成をサポートしています。
マテリアライズドビューの作成は非同期操作です。このコマンドが成功すると、マテリアライズドビューの作成タスクが正常に送信されたことを示します。データベース内の同期マテリアライズドビューの構築状況はSHOW ALTER MATERIALIZED VIEWコマンドで確認でき、非同期マテリアライズドビューの状況はメタデータビューtasksおよびtask_runsをInformation Schemaでクエリすることで確認できます。
StarRocksはv2.4から非同期マテリアライズドビューをサポートしています。以前のバージョンにおける非同期マテリアライズドビューと同期マテリアライズドビューの主な違いは次のとおりです。
| 単一テーブル集計 | 複数テーブルジョイン | クエリの書き換え | リフレッシュ戦略 | ベーステーブル | |
|---|---|---|---|---|---|
| ASYNC MV | はい | はい | はい |
| 複数のテーブルから:
|
| 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 (オプション)
マテリアライズドビューに関するコメント。COMMENTはmv_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。ここでa、b、cはベーステーブルの列名です。マテリアライズドビューの列名を指定しない場合、StarRocksは自動的に列に名前を付けます。 - 式、例:
SELECT a+1 AS x, b+2 AS y, c*c AS z FROM table_a。ここでa+1、b+2、c*cはベーステーブルの列を参照する式で、x、y、zはマテリアライズドビューの列に割り当てられたエイリアスです。
注意
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 bやselect 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 bとselect 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はプレフィックス列に基づいてソートキーを自動的に選択します。
- ORDER BY句の列は、
同期マテリアライズドビューのクエリ
同期マテリアライズドビューは本質的にベーステーブルのインデックスであり、物理テーブルではないため、ヒント[_SYNC_MV_]を使用してのみ同期マテリアライズドビューをクエリできます。
-- ヒント内の角括弧 [] を省略しないでください。
SELECT * FROM <mv_name> [_SYNC_MV_];
注意
現在、StarRocksは、エイリアスを指定しても同期マテリアライズドビューの列に対して自動的に名前を生成します。
同期マテリアライズドビューによる自動クエリの書き換え
同期マテリアライズドビューのパターンに従ったクエリが実行されると、元のクエリステートメントが自動的に書き換えられ、マテリアライズドビューに保存された中間結果が使用されます。
次の表は、元のクエリの集計関数とマテリアライズドビューを構築するために使用される集計関数の対応を示しています。ビジネスシナリオに応じて、対応する集計関数を選択してマテリアライズドビューを構築できます。
| 元のクエリの集計関数 | マテリアライズドビューの集計関数 |
|---|---|
| sum | sum |
| min | min |
| max | max |
| count | count |
| bitmap_union, bitmap_union_count, count(distinct) | bitmap_union |
| hll_raw_agg, hll_union_agg, ndv, approx_count_distinct | hll_union |
| percentile_approx, percentile_union | percentile_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 (オプション)
マテリアライズドビューに関するコメント。COMMENTはmv_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)として指定できます。使用可能な単位はDAY、HOUR、MINUTE、SECONDです。デフォルト値は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つのパーティション式のみがサポートされています。
注意
v3.3.3以降、StarRocksはリストパーティション化戦略を使用した非同期マテリアライズドビューの作成をサポートしています。
- リストパーティション化または式に基づくパーティション化戦略で作成されたテーブルに基づいて、リストパーティション化されたマテリアライズドビューを作成できます。
- 現在、リストパーティション化戦略でマテリアライズドビューを作成する際には、1つのパーティションキーのみを指定できます。ベーステーブルに複数のパーティションキーがある場合は、1つのパーティションキーを選択する必要があります。
- リストパーティション化戦略を持つマテリアライズドビューのリフレッシュ動作とクエリの書き換えロジックは、レンジパーティション化戦略を持つものと一致しています。
有効な値:
column_name: パーティション化に使用され る列の名前。PARTITION BY dtという式は、dt列に従ってマテリアライズドビューをパーティション化することを意味します。date_trunc関数: 時間単位を切り捨てるために使用される関数。PARTITION BY date_trunc("MONTH", dt)は、dt列を月単位で切り捨ててパーティション化することを意味します。date_trunc関数は、YEAR、MONTH、DAY、HOUR、MINUTEの単位で時間を切り捨てることをサポートします。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 Transform Iceberg パーティション式 マテリアライズドビューパーティション式 Identity <col><col>hour hour(<col>)date_trunc('hour', <col>)day day(<col>)date_trunc('day', <col>)month month(<col>)date_trunc('month', <col>)year year(<col>)date_trunc('year', <col>)bucket bucket(<col>, <n>)サポートされていません truncate truncate(<col>)サポートされていません -
非Icebergタイプのパーティション列については、パーティション式の計算が関与しないため、マテリアライズドビュー作成時は直接マッピングを選択するだけで、追加のパーティション式処理は必要ありません。
複数列パーティション式の詳細なガイダンスについては、例5を参照してください。
このパラメータが指定されていない場合、デフォルトではパーティション戦略は採用されません。
order_by_expression (オプション)
非同期マテリアライズドビューのソートキー。このソートキーを指定しない場合、StarRocksはSELECT列からいくつかのプレフィックス列をソートキーとして選択します。例: select a, b, c, dでは、ソートキーとしてaとbを使用できます。このパラメータはStarRocks v3.0以降でサポートされています。
注意 マテリアライズドビューには2つの異なる
ORDER BYの使用方法があります:
- CREATE MATERIALIZED VIEWステートメントの
ORDER BYはマテリアライズドビューのソートキーを定義し、ソートキーに基づくクエリの加速に役立ちます。これはマテリアライズドビューのSPJGベースの透過的加速機能には影響しませんが、マテリアライズドビューのクエリ結果のグローバルソートを保証しません。- マテリアライズドビューのクエリ定義の
ORDER BYはクエリ結果のグローバルソートを保証しますが、マテリアライズドビューがSPJGベースの透過的クエリの書き換えに使用されることを防ぎます。したがって、マテリアライズドビューがクエリ の書き換えに使用される場合、マテリアライズドビューのクエリ定義でORDER BYを使用すべきではありません。
INDEX (オプション)
非同期マテリアライズドビューは、クエリパフォーマンスを高速化するために Bitmap インデックスと BloomFilter インデックスをサポートしています。Bitmap インデックスと BloomFilter インデックスの使用例と情報の詳細については、Bitmap Index と Bloom 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: 記憶媒体のタイプ。有効な値:HDDとSSD。 -
storage_cooldown_time: パーティションのストレージクールダウン時間。HDDとSSDの両方の記憶媒体が使用されている場合、このプロパティで指定された時間の後、SSDストレージのデータはHDDストレージに移動されます。形式: "yyyy-MM-dd HH:mm:ss"。指定された時間は現在の時間より後でなければなりません。このプロパティが明示的に指定されていない場合、デフォルトではストレージクールダウンは実行されません。 -
bloom_filter_columns: BloomFilter インデックスを有効にするカラム名の配列。BloomFilter インデックスについての詳細は、ブルーム・フィルター・インデックス を参照ください。 -
partition_ttl: パーティションの有効期限 (TTL)。指定された時間範囲内のデータを持つパーティションが保持されます。期限切れのパーティションは自動的に削除されます。単位:YEAR、MONTH、DAY、HOUR、MINUTE。例: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