CREATE MATERIALIZED VIEW
説明
マテリアライズドビューを作成します。マテリアライズドビューの使用情報については、 Synchronous materialized view および Asynchronous materialized view を参照してください。
注意
ベーステーブルが存在するデータベースで CREATE MATERIALIZED VIEW 権限を持つユーザーのみがマテリアライズドビューを作成できます。
マテリアライズドビューの作成は非同期操作です。このコマンドが正常に実行されると、マテリアライズドビューの作成タスクが正常に送信されたことを示します。データベース内の同期マテリアライズドビューの構築状況は SHOW ALTER MATERIALIZED VIEW コマンドで確認でき、非同期マテリアライズドビューの状況は Information Schema のメタデータビュー tasks および task_runs をクエリすることで確認できます。
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>を実行します。詳細については、 Query analysis を参照してください。
- 各複雑な式にはエイリアスが必要であり、ベーステーブルのすべての同期マテリアライズドビュー間で異なる複雑な式には異なるエイリアスを割り当てる必要があります。たとえば、
-
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 |
非同期マテリアライズドビュー
構文
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>]詳細については、 Data distribution を参照してください。
注意
v2.5.7 以降、StarRocks はテーブルを作成する際やパーティションを追加する際にバケット数 (BUCKETS) を自動的 に設定できます。バケット数を手動で設定する必要はありません。詳細については、 set the number of buckets を参照してください。
-
ランダムバケット法:
ランダムバケット戦略を選択し、StarRocks にバケット数を自動的に設定させる場合、
distribution_descを指定する必要はありません。ただし、バケット数を手動で設定したい場合は、次の構文を参照してください:DISTRIBUTED BY RANDOM BUCKETS <bucket_number>注意
ランダムバケット戦略を持つ非同期マテリアライズドビューは、コロケーショングループに割り当てることはできません。
詳細については、 Random bucketing を参照してください。
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 つのパーティション式のみがサポートされています。
注意
現在、非同期マテリアライズドビューはリストパーティション化戦略をサポートしていません。
有効な値:
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)。
このパラメータが指定されていない場合、デフォルトではパーティション戦略は採用されません。
order_by_expression (オプション)
非同期マテリアライズドビューのソートキー。このソートキーを指定しない場合、StarRocks は SELECT 列からいくつかのプレフィックス列をソートキーとして選択します。たとえば、select a, b, c, d では、ソートキーは a と b になります。このパラメータは StarRocks v3.0 以降でサポートされています。
PROPERTIES (オプション)
非同期マテリアライズドビューのプロパティ。既存のマテリアライズドビューのプロパティを変更するには、 ALTER MATERIALIZED VIEW を使用できます。
-
session.: マテリアライズドビューのセッション変数関連のプロパティを変更する場合、プロパティにsession.プレフィックスを追加する必要があります。たとえば、session.query_timeout。セッションプロパティ以外のプロパティにはプレフィックスを指定する必要はありません。たとえば、mv_rewrite_staleness_second。 -
replication_num: 作成するマテリアライズドビューのレプリカの数。 -
storage_medium: 記憶媒体のタイプ。有効な値はHDDとSSDです。 -
storage_cooldown_time: パーティションのストレージクールダウン時間。HDD と SSD の両方の記憶媒体が使用されている場合、このプロパティで指定された時間の後に SSD ストレージのデータが HDD ストレージに移動されます。形式: "yyyy-MM-dd HH:mm:ss"。指定された時間は現在の時間より後でなければなりません。このプロパティが明示的に指定されていない場合、デフォルトではストレージクールダウンは実行されません。 -
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で指定された時間間隔に従ってマテリアライズドビューのパーティションを定期的にチェックし、期限切れのパーティションを自動的に削除します。 dynamic partitioning 戦略を有効にした場合、事前に作成されたパーティションはカウントされません。値が-1の場合、マテリアライズドビューのすべてのパーティションが保持されます。デフォルト:-1。 -
partition_refresh_number: 単一のリフレッシュでリフレッシュする最大パーティション数。リフレッシュするパーティションの数がこの値を超える場合、StarRocks はリフレッシュタスクを分割し、バッチで完了します。前のバッチのパーティションが正常にリフレッシュされると、StarRocks は次のバッチのパーティションをリフレッシュし続け、すべてのパーティションがリフレッシュされるまで続けます。パーティションのいずれかがリフレッシュに失敗した場合、後続のリフレッシュタスクは生成されません。値が-1の場合、リフレッシュタスクは分割されません。デフォルト値は-1です。 -
excluded_trigger_tables: マテリアライズドビューのベーステーブルがここにリストされている場合、ベーステーブルのデータが変更されても自動リフレッシュタスクはトリガーされません。このパラメータはロードトリガーリフレッシュ戦略にのみ適用され、通常はプロパティauto_refresh_partitions_limitと一緒に使用されます。形式:[db_name.]table_name。値が空文字列の場合、すべてのベーステーブルのデータ変更が対応するマテリアライズドビューのリフレッシュをトリガーします。デフォルト値は空文字列です。 -
auto_refresh_partitions_limit: マテリアライズドビューのリフレッシュがトリガーされたときにリフレッシュが必要な最新のマテリアライズドビューのパーティション数。このプロパティを使用してリフレッシュ範囲を制限し、リフレッシュコストを削減できます。ただし、すべてのパーティションがリフレッシュされないため、マテリアライズドビューのデータはベーステーブルと一致しない場合があります。デフォルト:-1。値が-1の場合、すべてのパーティションがリフレッシュされます。値が正の整数 N の場合、StarRocks は既存のパーティションを時系列順に並べ替え、現在のパーティションと N-1 の最新のパーティションをリフレッシュします。パーティションの数が N 未満の場合、StarRocks はすべての既存のパーティションをリフレッシュします。マテリアライズドビューに事前に作成された動的パーティションがある場合、StarRocks はすべての事前作成されたパーティションをリフレッシュします。 -
mv_rewrite_staleness_second: マテリアライズドビューの最後のリフレッシュがこのプロパティで指定された時間間隔内である場合、ベーステーブルのデータが変更されているかどうかに関係なく、クエリの書き換えに直接使用できます。最後のリフレッシュがこの時間間隔の前である場合、StarRocks はベーステーブルが更新され ているかどうかを確認して、マテリアライズドビューがクエリの書き換えに使用できるかどうかを判断します。単位: 秒。このプロパティは v3.0 からサポートされています。 -
colocate_with: 非同期マテリアライズドビューのコロケーショングループ。詳細については、 Colocate Join を参照してください。このプロパティは v3.0 からサポートされています。 -
unique_constraintsおよびforeign_key_constraints: View Delta Join シナリオでクエリの書き換えを行うために非同期マテリアライズドビューを作成する際のユニークキー制約および外部キー制約。詳細については、 Asynchronous materialized view - Rewrite queries in View Delta Join scenario を参照してください。このプロパティは v3.0 からサポートされています。注意
ユニークキー制約および外部キー制約はクエリの書き換えにのみ使用されます。テーブルにデータがロードされる際に外部キー制約のチェックは保証されません。テーブルにロードされるデータが制約を満たしていることを確認する必要があります。
-
resource_group: マテリアライズドビューのリフレッシュタスクが属するリソースグループ。このプロパティのデフォルト値はdefault_mv_wgで、これはマテリアライズドビューのリフレッシュ専用に定義されたシステムリソースグループです。default_mv_wgのcpu_core_limitは1、mem_limitは0.8です。リソースグループの詳細については、 Resource group を参照してください。 -
query_rewrite_consistency: 非同期マテリアライズドビューのクエリ書き換えルール。このプロパティは v3.2 からサポートされています。有効な値:disable: 非同期マテリアライズドビューの自動クエリ書き換えを無効にします。checked(デフォルト値): マテリアライズドビューが新鮮さの要件を満たしている場合にのみ自動クエリ書き換えを有効にします。つまり:mv_rewrite_staleness_secondが指定されていない場合、マテリアライズドビューのデータがすべてのベーステーブルのデータと一致している場合にのみクエリ書き換えに使用できます。mv_rewrite_staleness_secondが指定されている場合、最後のリフレッシュが新鮮さの時間間隔内である場合にクエリ書き換えに使用できます。
loose: 自動クエリ書き換えを直接有効にし、一貫性のチェックは不要です。
-
storage_volume: 共有データクラスタを使用している場合に作成する非同期マテリアライズドビューを保存するために使用されるストレージボリュームの名前。このプロパティは v3.1 以降でサポートされています。このプロパティが指定されていない場合、デフォルトのストレージボリュームが使用されます。例:"storage_volume" = "def_volume"。 -
force_external_table_query_rewrite: 外部カタログベースのマテリアライズドビューのクエリ書き換えを有効にするかどうか。このプロパティは v3.2 からサポートされています。有効な値:true: 外部カタログベースのマテリアライズドビューのクエリ書き換えを有効にします。false(デフォルト値): 外部カタログベースのマテリアライズドビューのクエリ書き換えを無効にします。
ベーステーブルと外部カタログベースのマテリアライズドビュー間の強いデータ一貫性は保証されていないため、この機能はデフォルトで
falseに設定されています。この機能が有効になっている場合、マテリアライズドビューはquery_rewrite_consistencyで指定されたルールに従ってクエリ書き換えに使用されます。
query_statement (必須)
非同期マテリアライズドビューを作成するためのクエリステートメント。v3.1.6 以降、StarRocks は Common Table Expression (CTE) を使用した非同期マテリアライズドビューの作成をサポートしています。
注意
現在、StarRocks はリストパーティション化戦略で作成されたベーステーブルを使用して非同期マテリアライズドビューを作成することをサポートしていません。