创建分区物化视图
本文介绍了如何使用分区物化视图满足不同业务需求。
概述
StarRocks 的异步物化视图支持多种分区策略和函数,方便您实现以下效果:
-
增量构建
在创建分区物化视图时,您可以设置分区刷新任务分批执行,以避免所有分区并行刷新导致过多资源消耗。
-
增量刷新
您可以将刷新任务设置为基表分区有数据更新时,仅更新物化视图的相应分区。分区级别的刷新可以显著减少刷新整个物化视图所导致的资源浪费。
-
局部物化
您可以为物化视图分区设置 TTL,从而实现数据的部分物化。
-
透明查询改写
查询可以仅基于最新的物化视图分区进行透明改写。过期的分区不会参与查询计划,相应查询将在基表上直接执行,从而确保数据的一致性。
使用限制
分区物化视图只能在分区基表(通常是事实表)上创建。您需要通过映射基表和物化视图之间的分区关系建立两者之间的协同关系。
目前,StarRocks 支持在以下数据源中的表上构建分区物化视图:
- StarRocks Default Catalog 中的 OLAP 表
- 支持的分区策略:Range 分区
- 支持的分区键数据类型:INT、DATE、DATETIME 和 STRING
- 支持的表类型:主键表、明细表、聚合表和更新表
- 支持存算一体和存算分离集群
- Hive Catalog、Hudi Catalog、Iceberg Catalog 和 Paimon Catalog 中的表
- 支持的分区级别:一级分区
- 支持的分区键数据类型:INT、DATE、DATETIME 和 STRING
- 不支持基于非分区基表创建分区物化视图。
- 对于 StarRocks OLAP 表:
- 目前不支持 List 分区和表达式分区。
- 基表的两个相邻 分区必须具有连续的范围。
- 对于 External Catalog 中的多级分区基表,只能使用一级分区路径来创建分区物化视图。例如,对于以
yyyyMMdd/hour
格式分区的表,只能构建按yyyyMMdd
分区的物化视图。 - 从 v3.2.3 版本开始,StarRocks 支持在使用 Partition Transforms (分区变换) 的 Iceberg 表上创建分区物化视图,物化视图将根据变换后的列进行分区。更多信息,参考 使用物化视图加速数据湖查询 - 选择合适的刷新策略。
使用场景
假设有以下基表:
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 List 中 将基表的分区键转换为 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;