パーティシ ョン化されたマテリアライズドビューを作成する
このトピックでは、さまざまなユースケースに対応するためにパーティション化されたマテリアライズドビューを作成する方法を紹介します。
概要
StarRocks の非同期マテリアライズドビューは、さまざまなパーティショニング戦略と機能をサポートしており、次の効果を達成できます。
-
インクリメンタル構築
パーティション化されたマテリアライズドビューを作成する際、パーティションをバッチでリフレッシュするように作成タスクを設定することで、過剰なリソース消費を避けることができます。
-
インクリメンタルリフレッシュ
ベーステーブルの特定のパーティションでデータの変更を検出した場合、マテリアライズドビューの対応するパーティションのみを更新するようにリフレッシュタスクを設定できます。パーティションレベルのリフレッシュは、マテリアライズドビュー全体をリフレッシュするために使用されるリソースの無駄を大幅に防ぐことができます。
-
部分的なマテリアライゼーション
マテリアライズドビューパーティションに TTL を設定することで、データの部分的なマテリアライゼーションを可能にします。
-
透過的なクエリの書き換え
クエリは、更新されたマテリアライズドビューパーティションのみに基づいて透過的 に書き換えられます。古いと見なされるパーティションはクエリプランに関与せず、クエリはデータの一貫性を保証するためにベーステーブルで実行されます。
制限事項
パーティション化されたマテリアライズドビューは、パーティション化されたベーステーブル(通常はファクトテーブル)にのみ作成できます。ベーステーブルとマテリアライズドビューの間のパーティション関係をマッピングすることで、両者のシナジーを構築できます。
現在、StarRocks は次のデータソースからのテーブルに対してパーティション化されたマテリアライズドビューの構築をサポートしています。
- デフォルトカタログ内の 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でパーティション化されたマテリアライズドビューのみを構築できます。 - v3.2.3 以降、StarRocks は Iceberg テーブルに対して Partition Transforms を使用したパ ーティション化されたマテリアライズドビューの作成をサポートしており、マテリアライズドビューは変換後の列でパーティション化されます。詳細については、Data lake query acceleration with materialized views - Choose a suitable data_lake_query_acceleration_with_materialized_views.mdterialized_views.md#choose-a-suitable-refresh-strategy を参照してください。
ユースケース
次のようなベーステーブルがあるとします。
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);