パーティション化されたマテリアライズドビューの作成
このトピックでは、さまざまなユースケースに対応するためのパーティション化されたマテリアライズドビューの作成方法を紹介します。
概要
StarRocks の非同期マテリアライズドビューは、さまざまなパーティション戦略と機能をサポートしており、次の効果を達成できます。
-
インクリメンタル構築
パーティション化されたマテリアライズドビューを作成する際、パーティションをバッチでリフレッシュするように作成タスクを設定することで、過剰なリソース消費を避けることができます。
-
インクリメンタルリフレッシュ
ベーステーブルの特定のパーティションでデータの変更を検出した場合、マテリアライズドビューの対応するパーティションのみを更新するようにリフレッシュタスクを設定できます。パーティションレベルのリフレッシュは、マテリアライズドビュー全体をリフレッシュするために使用されるリソースの無駄を大幅に防ぐことができます。
-
部分的なマテリアライゼーション
マテ リアライズドビューのパーティションに対して TTL を設定することで、データの部分的なマテリアライゼーションを可能にします。
-
透過的なクエリの書き換え
クエリは、更新されたマテリアライズドビューのパーティションに基づいて透過的に書き換えられます。古いと見なされるパーティションはクエリプランに関与せず、クエリはデータの一貫性を保証するためにベーステーブルで実行されます。
制限事項
パーティション化されたマテリアライズドビューは、パーティション化されたベーステーブル(通常はファクトテーブル)にのみ作成できます。ベーステーブルとマテリアライズドビューの間のパーティション関係をマッピングすることで、両者のシナジーを構築できます。
現在、StarRocks は次のデータソースからのテーブルに対してパーティション化されたマテリアライズドビューの構築をサポートしています。
- Default Catalog の StarRocks OLAP テーブル
- サポートされるパーティション戦略: レンジパーティション化
- パーティショニングキーのサポートされるデータ型: INT, DATE, DATETIME, STRING
- サポートされるテーブルタイプ: Primary Key, Duplicate Key, Aggregate Key, Unique Key
- 共有なしクラスタと共有データクラスタの両方でサポート
- Hive Catalog, Hudi Catalog, Iceberg Catalog, Paimon Catalog のテーブ ル
- サポートされるパーティションレベル: プライマリレベル
- パーティショニングキーのサポートされるデータ型: INT, DATE, DATETIME, STRING
- 非パーティション化されたベース(ファクト)テーブルに基づいてパーティション化されたマテリアライズドビューを作成することはできません。
- StarRocks OLAP テーブルの場合:
- 現在、リストパーティション化と式に基づくパーティション化はサポートされていません。
- ベーステーブルの隣接する2つのパーティションは連続した範囲を持つ必要があります。
- 外部カタログのマルチレベルパーティション化されたベーステーブルの場合、プライマリレベルのパーティションパスのみを使用してパーティション化されたマテリアライズドビューを作成できます。たとえば、
yyyyMMdd/hour形式でパーティション化されたテーブルの場合、yyyyMMddでパーテ ィション化されたマテリアライズドビューのみを構築できます。
ユースケース
次のようなベーステーブルがあるとします。
CREATE TABLE IF NOT EXISTS par_tbl1 (
datekey DATE, -- パーティショニングキーとして使用される DATE 型の日付列。
k1 STRING,
v1 INT,
v2 INT
)
ENGINE=olap
PARTITION BY RANGE (datekey) (
START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(k1);
CREATE TABLE IF NOT EXISTS par_tbl2 (
datekey STRING, -- パーティショニングキーとして使用される STRING 型の日付列。
k1 STRING,
v1 INT,
v2 INT
)
ENGINE=olap
PARTITION BY RANGE (str2date(datekey, '%Y-%m-%d')) (
START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(k1);
CREATE TABLE IF NOT EXISTS par_tbl3 (
datekey_new DATE, -- par_tbl1.datekey と同等の列。
k1 STRING,
v1 INT,
v2 INT
)
ENGINE=olap
PARTITION BY RANGE (datekey_new) (
START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(k1);
パーティションを一対一で整列させる
同じパーティショニングキーを使用して、ベーステーブルのパーティションと一対一で対応するマテリアライズドビューを作成できます。

-
ベーステーブルのパーティショニングキーが DATE または DATETIME 型の場合、マテリアライズドビューに同じパーティショニングキーを直接指定できます。
PARTITION BY <base_table_partitioning_column>例:
CREATE MATERIALIZED VIEW par_mv1
REFRESH ASYNC
PARTITION BY datekey
AS
SELECT
k1,
sum(v1) AS SUM,
datekey
FROM par_tbl1
GROUP BY datekey, k1; -
ベーステーブルのパーティショニングキーが STRING 型の場合、str2date 関数を使用して日付文字列を DATE または DATETIME 型に変換できます。
PARTITION BY str2date(<base_table_partitioning_column>, <format>)例:
CREATE MATERIALIZED VIEW par_mv2
REFRESH ASYNC
PARTITION BY str2date(datekey, '%Y-%m-%d')
AS
SELECT
k1,
sum(v1) AS SUM,
datekey
FROM par_tbl2
GROUP BY datekey, k1;
時間粒度のロールアップでパーティションを整列させる
パーティショニングキーに date_trunc 関数を使用することで、ベーステーブルよりも大きな粒度でパーティション化されたマテリアライズドビューを作成できます。ベーステーブルのパーティションでデータの変更が検出されると、StarRocks はマテリアライズドビューの対応するロールアップパーティションをリフレッシュします。

-
ベーステーブルのパーティショニングキーが DATE または DATETIME 型の場合、ベーステーブルのパーティショニングキーに date_trunc 関数を直接使用できます。
PARTITION BY date_trunc(<format>, <base_table_partitioning_column>)例:
CREATE MATERIALIZED VIEW par_mv3
REFRESH ASYNC
PARTITION BY date_trunc('month', datekey)
AS
SELECT
k1,
sum(v1) AS SUM,
datekey
FROM par_tbl1
GROUP BY datekey, k1; -
ベーステーブルのパーティショニングキーが STRING 型の場合、SELECT リストでベーステーブルのパーティショニングキーを DATE または DATETIME 型に変換し、エイリアスを設定して、それを date_trunc 関数で使用してマテリアライズドビューのパーティショニングキーを指定します。
PARTITION BY
date_trunc(<format>, <mv_partitioning_column>)
AS
SELECT
str2date(<base_table_partitioning_column>, <format>) AS <mv_partitioning_column>例:
CREATE MATERIALIZED VIEW par_mv4
REFRESH ASYNC
PARTITION BY date_trunc('month', mv_datekey)
AS
SELECT
datekey,
k1,
sum(v1) AS SUM,
str2date(datekey, '%Y-%m-%d') AS mv_datekey
FROM par_tbl2
GROUP BY datekey, k1;
カスタマイズされた時間粒度でパーティションを整列させる
上記のパーティションロールアップ方法は、特定の時間粒度に基づいてマテリアライズドビューをパーティション化することのみを許可し、パーティションの時間範囲をカスタ マイズすることはできません。ビジネスシナリオでカスタマイズされた時間粒度を使用してパーティション化する必要がある場合、date_trunc 関数と time_slice 関数を使用して、指定された時間粒度に基づいて与えられた時間を時間間隔の開始または終了に変換することで、マテリアライズドビューのパーティションの時間粒度を定義できます。
SELECT リストでベーステーブルのパーティショニングキーに time_slice 関数を使用して新しい時間粒度(間隔)を定義し、エイリアスを設定して、それを date_trunc 関数で使用してマテリアライズドビューのパーティショニングキーを指定します。
PARTITION BY
date_trunc(<format>, <mv_partitioning_column>)
AS
SELECT
-- time_slice を使用できます。
time_slice(<base_table_partitioning_column>, <interval>) AS <mv_partitioning_column>
例:
CREATE MATERIALIZED VIEW par_mv5
REFRESH ASYNC
PARTITION BY date_trunc('day', mv_datekey)
AS
SELECT
k1,
sum(v1) AS SUM,
time_slice(datekey, INTERVAL 5 MINUTE) AS mv_datekey
FROM par_tbl1
GROUP BY datekey, k1;