パーティション化されたマテリアライズドビューを使用すると、増分ビルド、増分更新、部分的なマテリアライズ、および透明なクエリリライトが可能になり、効率的なデータ管理を実現します。
背景情報
StarRocks の非同期マテリアライズドビューは、複数のパーティショニング戦略をサポートしており、次の目的を達成できます。
-
増分ビルド:すべてのパーティションを並列で処理することによるリソース過負荷を回避するために、パーティション更新タスクをバッチで実行します。
-
増分更新:変更されたベーステーブルのパーティションに対応するマテリアライズドビューパーティションのみを更新し、完全更新と比べてリソースの無駄を大幅に削減します。
-
部分的なマテリアライズ:マテリアライズドビューパーティションに TTL を設定して、データの一部のみをマテリアライズします。
-
透明なクエリリライト:クエリは最新のマテリアライズドビューパーティションのみを使用するように自動的にリライトされます。期限切れのパーティションはクエリプランから除外され、StarRocks はそれらのクエリをベーステーブルに直接ルートすることでデータ整合性を確保します。
制限事項
パーティション化されたマテリアライズドビューは、パーティション化されたベーステーブル(通常はファクトテーブル)に対してのみ作成できます。ベーステーブルのパーティションとマテリアライズドビューパーティションとの間のマッピングを定義する必要があります。
現在、StarRocks は以下のデータソース内のテーブルに対してパーティション化されたマテリアライズドビューの作成をサポートしています。
-
StarRocks デフォルトカタログ内の OLAP テーブル
-
サポートされるパーティショニング戦略:レンジパーティショニング
-
サポートされるパーティションキーのデータ型:INT、DATE、DATETIME、STRING
-
サポートされるテーブルタイプ:プライマリキーテーブル、ディテールテーブル、集計テーブル、アップデートテーブル
-
ストレージとコンピューティングが統合されたインスタンスおよび分離されたインスタンスの両方をサポート
-
-
Hive カタログ、Hudi カタログ、Iceberg カタログ、Paimon カタログ内のテーブル
-
サポートされるパーティションレベル:第 1 レベルのパーティショニング
-
サポートされるパーティションキーのデータ型:INT、DATE、DATETIME、STRING
-
-
非パーティション化されたベーステーブルに対しては、パーティション化されたマテリアライズドビューを作成できません。
-
StarRocks OLAP テーブルに特有の制限事項:
-
リストパーティショニングおよび式パーティショニングは現在サポートされていません。
-
ベーステーブル内の隣接するパーティションは連続した範囲を形成している必要があります。
-
-
外部カタログ内のマルチレベルパーティション化されたベーステーブルの場合、マテリアライズドビューの作成には第 1 レベルのパーティションパスのみを使用できます。たとえば、
yyyyMMdd/hour形式のテーブルでは、yyyyMMddでパーティション化されたマテリアライズドビューのみを作成できます。 -
v3.2.3 以降、StarRocks は Partition Transforms を使用する Iceberg テーブルに対してパーティション化されたマテリアライズドビューの作成をサポートしています。マテリアライズドビューは、変換された列に基づいてパーティション化されます。
ユースケース
次の構造とパーティショニング設計を持つ 3 つのテーブルがあると仮定します。
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);
パーティションを 1 対 1 で整列
同じパーティションキーを使用して、ベーステーブルのパーティションと 1 対 1 で対応するマテリアライズドビューを作成します。
ベーステーブルのパーティションキーの型に応じて、マテリアライズドビューを作成します。
-
ベーステーブルのパーティションキーが 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;
-
カスタム時間粒度によるパーティション整列
カスタム時間粒度の場合は、time_slice または date_slice 関数を使用してマテリアライズドビューを作成します。これらの関数は、指定された間隔に基づいて与えられた時刻を期間の開始または終了に変換します。
SELECT リスト内で time_slice または date_slice 関数をベーステーブルのパーティションキーに適用し、エイリアスを割り当てたうえで、そのエイリアスに date_trunc 関数を適用してマテリアライズドビューのパーティションキーとして使用します。
-
構文
PARTITION BY date_trunc(<format>, <mv_partitioning_column>) AS SELECT -- time_slice または date_slice 関数のいずれかを使用できます。 date_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, date_slice(datekey, INTERVAL 5 HOUR) AS mv_datekey FROM par_tbl1 GROUP BY datekey, k1;
複数のベーステーブルにまたがるパーティション整列
この機能は v3.3 以降でサポートされています。
複数のベーステーブルが整列可能なパーティション(同じ型のパーティションキー)を持つ場合、パーティションキー列で結合するか、UNION で接続してマテリアライズドビューを作成できます。このような整列されたベーステーブルは参照テーブルと呼ばれます。いずれかの参照テーブルでデータが変更されると、対応するマテリアライズドビューパーティションが更新されます。
-- JOIN を使用してベーステーブルを接続。
CREATE MATERIALIZED VIEW par_mv6
REFRESH ASYNC
PARTITION BY datekey
AS SELECT
par_tbl1.datekey,
par_tbl1.k1 AS t1k1,
par_tbl3.k1 AS t2k1,
sum(par_tbl1.v1) AS SUM1,
sum(par_tbl3.v1) AS SUM2
FROM par_tbl1 JOIN par_tbl3 ON par_tbl1.datekey = par_tbl3.datekey_new
GROUP BY par_tbl1.datekey, t1k1, t2k1;
-- UNION を使用してベーステーブルを接続。
CREATE MATERIALIZED VIEW par_mv7
REFRESH ASYNC
PARTITION BY datekey
AS SELECT
par_tbl1.datekey,
par_tbl1.k1 AS t1k1,
sum(par_tbl1.v1) AS SUM1
FROM par_tbl1
GROUP BY
par_tbl1.datekey,
par_tbl1.k1
UNION ALL
SELECT
par_tbl3.datekey_new,
par_tbl3.k1 AS t2k1,
sum(par_tbl3.v1) AS SUM2
FROM par_tbl3
GROUP BY
par_tbl3.datekey_new,
par_tbl3.k1;
増分更新と透明なクエリリライトの実装
増分更新と透明なクエリリライトを有効にするために、パーティション化されたマテリアライズドビューを作成します。
マテリアライズドビューを作成する際には、次の点を考慮する必要があります。
-
更新粒度
partition_refresh_numberプロパティを使用して、1 回の操作で更新するパーティションの最大数を指定します。更新対象のパーティション数がこの値を超える場合、StarRocks は更新タスクを分割し、古い順(将来のパーティションを除く)にバッチ処理します。デフォルト値は -1 で、StarRocks が更新タスクを分割しないことを意味します。 -
マテリアライズ範囲
マテリアライズデータの保持範囲は、
partition_ttl_numberプロパティ(v3.1.5 より前のバージョン)またはpartition_ttlプロパティ(v3.1.5 以降推奨)によって制御されます。partition_ttl_numberは保持する最新パーティションの数を指定し、partition_ttlは保持期間を定義します。各更新時に、StarRocks はパーティションを時間順にソートし、TTL 要件を満たすもののみを保持します。 -
更新戦略
-
自動更新 (
REFRESH ASYNC):StarRocks はベーステーブルのデータが変更されたときにマテリアライズドビューを自動的に更新します。 -
スケジュール更新 (
REFRESH ASYNC [START (<start_time>)] EVERY (INTERVAL <interval>)):StarRocks は指定された間隔でマテリアライズドビューを更新します。説明StarRocks は、自動更新およびスケジュール更新タスクがトリガーされると自動的に実行します。StarRocks はベーステーブルの各パーティションのデータバージョンを記録・比較します。データバージョンの変更は、対応するデータが更新されたことを示します。ベーステーブルのパーティションでデータ変更が検出されると、StarRocks は対応するマテリアライズドビューパーティションを更新します。データ変更がない場合は、そのパーティションの更新はスキップされます。
-
手動更新 (
REFRESH MANUAL):このモードでは、REFRESH MATERIALIZED VIEW文を実行してマテリアライズドビューを手動で更新する必要があります。更新対象の時間範囲を指定して、マテリアライズドビュー全体を更新しないようにできます。FORCEが文に指定されている場合、StarRocks はベーステーブルのデータが変更されているかどうかに関係なく、ビューまたはパーティションを強制的に更新します。文にWITH SYNC MODEを追加すると、更新タスクが同期的に実行され、成功または失敗の結果のみが返されます。
-
次の例は、par_mv8 という名前のパーティション化されたマテリアライズドビューを作成する方法を示しています。このビューは、対応するベーステーブルのパーティションのデータが更新されると、自動的にそのパーティションを更新します。更新操作はバッチで実行され、各バッチでは 1 つのパーティションのみが更新されます("partition_refresh_number" = "1" で設定)。ストレージコストを制御するために、マテリアライズドビューは最新の 2 つのパーティションのみを保持します("partition_ttl_number" = "2" で設定)。StarRocks は更新サイクル中に古い余分なパーティションを自動的に削除します。
CREATE MATERIALIZED VIEW par_mv8
REFRESH ASYNC
PARTITION BY datekey
PROPERTIES (
"partition_ttl_number" = "2",
"partition_refresh_number" = "1"
) AS
SELECT k1, SUM(v1) AS total_v1, datekey
FROM par_tbl1
GROUP BY datekey, k1;
REFRESH MATERIALIZED VIEW 文を使用して、このマテリアライズドビューを更新できます。次の例は、par_mv8 内の指定された時間範囲のパーティションを同期モードで強制的に更新します。
REFRESH MATERIALIZED VIEW par_mv8
PARTITION START ('2021-01-03') END ('2021-01-04')
FORCE WITH SYNC MODE;
実行後、EMR StarRocks Manager コンソールの Asynchronous Materialized Views ページでパーティションの更新ステータスを確認できます。
TTL メカニズムにより、par_mv8 はパーティションのライフサイクルを自動的に管理でき、最新データのクエリに重点を置くシナリオに最適です。これにより、最近のデータ(たとえば過去 1 週間または 1 ヶ月分のデータ)のクエリが高速化され、ストレージ使用量が削減されます。クエリが保持されたパーティション範囲外のデータを要求する場合、StarRocks はクエリをベーステーブルにルートしてデータ整合性を確保します。
次の例では、クエリ 1 は par_mv8 内の保持されたパーティションにヒットするため、マテリアライズドビューによって高速化されます。クエリ 2 は保持されたパーティション範囲外であるため、ベーステーブルにフォールバックします。
-- Query 1
SELECT
k1,
sum(v1) AS SUM,
datekey
FROM par_tbl1
WHERE datekey='2021-01-04'
GROUP BY datekey, k1;
-- Query 2
SELECT
k1,
sum(v1) AS SUM,
datekey
FROM par_tbl1
WHERE datekey='2021-01-01'
GROUP BY datekey, k1;
次の図は、マテリアライズドビューが部分的な結果をキャッシュすることでクエリパフォーマンスを向上させる様子を示しています。