跳到主要内容
版本: 最新版本-3.5

CREATE MATERIALIZED VIEW

CREATE MATERIALIZED VIEW 语句用于创建物化视图。有关物化视图的使用信息,参见同步物化视图异步物化视图

注意

  • 只有在基表所在的数据库中具有 CREATE MATERIALIZED VIEW 权限的用户才能创建物化视图。
  • 从 v3.4.0 起,StarRocks 支持在 Shared-Data 集群中创建同步物化视图。

创建物化视图是一个异步操作。成功执行此命令仅表示已成功提交创建物化视图的任务。您可以通过 SHOW ALTER MATERIALIZED VIEW 命令查看数据库中同步物化视图的构建状态,也可以通过查询 Information Schema 中的元数据视图 taskstask_runs 查看异步物化视图的构建状态。

StarRocks 从 v2.4 开始支持异步物化视图。异步物化视图与之前版本中的同步物化视图的主要区别如下:

单表聚合多表 Join查询重写刷新策略基表
ASYNC MV
  • 异步刷新
  • 手动刷新
来自多个表
  • 默认 Catalog
  • 外部 Catalog (v2.5)
  • 现有物化视图 (v2.5)
  • 现有视图 (v3.1)
SYNC MV (Rollup)聚合函数的选择有限数据加载期间的同步刷新默认 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 (必选)

    查询语句中的所有列,即物化视图 schema 中的所有列。此参数支持以下值:

    • 简单列或聚合列,例如 SELECT a, abs(b), min(c) FROM table_a,其中 abc 是基表中的列名。如果您没有为物化视图指定列名,StarRocks 会自动为这些列分配名称。
    • 表达式,例如 SELECT a+1 AS x, b+2 AS y, c*c AS z FROM table_a,其中 a+1b+2c*c 是引用基表中列的表达式,xyz 是分配给物化视图中列的别名。

    注意

    • 您必须在 select_expr 中指定至少一列。
    • 使用聚合函数创建同步物化视图时,您必须指定 GROUP BY 子句,并在 select_expr 中指定至少一个 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 bselect 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 bselect b, sum(a) as sum_a from table group by b 不能用于为同一个基表创建同步物化视图。您可以为复杂表达式设置不同的别名。
      • 您可以通过执行 EXPLAIN <sql_statement> 来检查您的查询是否被使用复杂表达式创建的同步物化视图重写。有关更多信息,参见查询分析
  • 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 会根据前缀列自动选择排序键。

查询同步物化视图

由于同步物化视图本质上是基表的索引,而不是物理表,因此您只能使用提示 [_SYNC_MV_] 查询同步物化视图。

-- Do not omit the brackets [] in the hint.
SELECT * FROM <mv_name> [_SYNC_MV_];

注意

目前,即使您已为同步物化视图中的列指定别名,StarRocks 也会自动为其生成名称。

使用同步物化视图自动查询重写

当执行遵循同步物化视图模式的查询时,原始查询语句会自动重写,并使用存储在物化视图中的中间结果。

下表显示了原始查询中的聚合函数与用于构建物化视图的聚合函数之间的对应关系。您可以根据您的业务场景选择相应的聚合函数来构建物化视图。

原始查询中的聚合函数物化视图的聚合函数
sumsum
minmin
maxmax
countcount
bitmap_union, bitmap_union_count, count(distinct)bitmap_union
hll_raw_agg, hll_union_agg, ndv, approx_count_distincthll_union
percentile_approx, percentile_unionpercentile_union

异步物化视图

语法

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>
[COMMENT ""]
-- You must specify either `distribution_desc` or `refresh_scheme`, or both.
-- 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
[ <partition_column> [,...] ] | [ <date_function_expr> ]
]
-- 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 会使用随机分桶策略并自动设置 Bucket 数量。

注意

创建异步物化视图时,您必须指定 distribution_descrefresh_scheme 中的一个或两个。

  • 哈希分桶:

    语法

    DISTRIBUTED BY HASH (<bucket_key1>[,<bucket_key2> ...]) [BUCKETS <bucket_number>]

    有关更多信息,参见数据分布

    注意

    自 v2.5.7 起,StarRocks 可以在您创建表或添加分区时自动设置 Bucket 数量(BUCKETS)。您不再需要手动设置 Bucket 数量。有关详细信息,参见设置 Bucket 数量

  • 随机分桶:

    如果您选择随机分桶策略并允许 StarRocks 自动设置 Bucket 数量,则无需指定 distribution_desc。但是,如果您想手动设置 Bucket 数量,可以参考以下语法:

    DISTRIBUTED BY RANDOM BUCKETS <bucket_number>

    注意

    使用随机分桶策略的异步物化视图无法分配到 Colocation Group。

    有关更多信息,参见随机分桶

refresh_moment (可选)

物化视图的刷新时刻。默认值:IMMEDIATE。有效值:

  • IMMEDIATE:在创建后立即刷新异步物化视图。
  • DEFERRED:在创建后不刷新异步物化视图。您可以手动刷新物化视图或计划定期刷新任务。

refresh_scheme (可选)

注意

创建异步物化视图时,您必须指定 distribution_descrefresh_scheme 中的一个或两个。

异步物化视图的刷新策略。有效值:

  • ASYNC:自动刷新模式。每次基表数据更改时,都会自动刷新物化视图。
  • ASYNC [START (<start_time>)] EVERY(INTERVAL <interval>):定期刷新模式。物化视图以定义的间隔定期刷新。您可以使用以下单位将间隔指定为 EVERY (interval n day/hour/minute/second)DAYHOURMINUTESECOND。默认值为 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 (可选)

异步物化视图的分区策略。如果未指定此参数,则默认不采用分区策略。

有效值

  • partition_column:用于分区的列。表达式 PARTITION BY dt 表示根据 dt 列对物化视图进行分区。
  • date_function_expr:用于分区的带有日期函数的复杂表达式。
    • date_trunc 函数:用于截断时间单位的函数。PARTITION BY date_trunc("MONTH", dt) 表示将 dt 列截断为月份作为分区单位。date_trunc 函数支持将时间截断为包括 YEARMONTHDAYHOURMINUTE 在内的单位。
    • str2date 函数:用于将基表的字符串类型分区转换为日期类型的函数。PARTITION BY str2date(dt, "%Y%m%d") 表示 dt 列是 STRING 日期类型,其日期格式为 "%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)

从 v3.5.0 开始,异步物化视图支持多列分区表达式。您可以为物化视图指定多个分区列,以映射基表的所有或部分分区列。

多列分区表达式的注意事项::

  • 目前,物化视图中的多列分区只能直接映射到基表的分区列。不支持使用基表分区列上的函数或表达式进行映射。

  • 由于 Iceberg 分区表达式支持 transform 函数,因此在将 Iceberg 分区表达式映射到 StarRocks 物化视图分区表达式时需要进行额外处理。映射关系如下:

    Iceberg TransformIceberg 分区表达式物化视图分区表达式
    Identity<col><col>
    hourhour(<col>)date_trunc('hour', <col>)
    dayday(<col>)date_trunc('day', <col>)
    monthmonth(<col>)date_trunc('month', <col>)
    yearyear(<col>)date_trunc('year', <col>)
    bucketbucket(<col>, <n>)不支持
    truncatetruncate(<col>)不支持
  • 对于非 Iceberg 分区列,如果未涉及到分区表达式的计算,则不需要额外的分区表达式处理。您可以直接映射它们。

有关多列分区表达式的详细说明,请参阅示例-5

注意

从 v3.3.3 开始,StarRocks 支持使用 List Partitioning 策略创建异步物化视图。

  • 您可以基于使用 List Partitioning 或 Expression partitioning 策略创建的表创建列表分区的物化视图。
  • 当前,使用 List Partitioning 策略创建物化视图时,只能指定一个 Partition Key。如果基表有多个 Partition Key,则必须选择一个 Partition Key。
  • 使用 List Partitioning 策略的物化视图的刷新行为和查询重写逻辑与使用 Range Partitioning 策略的物化视图一致。

order_by_expression (可选)

异步物化视图的排序键。如果您没有指定排序键,StarRocks 会从 SELECT 列中选择一些前缀列作为排序键。例如,在 select a, b, c, d 中,排序键可以是 ab。此参数从 StarRocks v3.0 开始支持。

INDEX (可选)

异步物化视图支持 Bitmap 和 BloomFilter 索引以加速查询性能,它们的用法与常规表中的用法相同。有关 Bitmap 和 BloomFilter 索引的用例和信息,请参阅:Bitmap 索引Bloom filter 索引

使用 Bitmap 索引

-- Create an index  
CREATE INDEX <index_name> ON <mv_name>(<column_name>) USING BITMAP COMMENT '<comment>';

-- Check index creation progress
SHOW ALTER TABLE COLUMN;

-- View indexes
SHOW INDEXES FROM <mv_name>;

-- Drop an index
DROP INDEX <index_name> ON <mv_name>;

使用 BloomFilter 索引

-- Create an index  
ALTER MATERIALIZED VIEW <mv_name> SET ("bloom_filter_columns" = "<col1,col2,col3,...>");

-- View indexes
SHOW CREATE MATERIALIZED VIEW <mv_name>;

-- Drop an index
ALTER MATERIALIZED VIEW <mv_name> SET ("bloom_filter_columns" = "");

PROPERTIES (可选)

异步物化视图的属性。您可以使用ALTER MATERIALIZED VIEW修改现有物化视图的属性。

  • session.:如果您想更改物化视图的会话变量相关属性,则必须在属性前添加 session. 前缀,例如 session.insert_timeout。您无需为非会话属性指定前缀,例如 mv_rewrite_staleness_second

  • replication_num:要创建的物化视图副本数。

  • storage_medium:存储介质类型。有效值:HDDSSD

  • storage_cooldown_time:分区的存储冷却时间。如果同时使用 HDD 和 SSD 存储介质,则 SSD 存储中的数据会在该属性指定的时间后移动到 HDD 存储。格式:“yyyy-MM-dd HH:mm:ss”。指定的时间必须晚于当前时间。如果未明确指定此属性,则默认不执行存储冷却。

  • bloom_filter_columns:启用 Bloom filter 索引的列名数组。有关 Bloom filter 索引的详细信息,请参阅Bloom filter 索引

  • partition_ttl:分区的生存时间(TTL)。保留数据在指定时间范围内的分区。过期分区会自动删除。单位:YEARMONTHDAYHOURMINUTE。例如,您可以将此属性指定为 2 MONTH。建议使用此属性而不是 partition_ttl_number。从 v3.1.5 开始支持。

  • partition_ttl_number:要保留的最近物化视图分区的数量。对于开始时间早于当前时间的分区,在这些分区的数量超过此值后,将删除较旧的分区。StarRocks 将根据 FE 配置项 dynamic_partition_check_interval_seconds 中指定的时间间隔定期检查物化视图分区,并自动删除过期的分区。如果您启用了动态分区策略,则预先创建的分区不计入其中。当值为 -1 时,将保留物化视图的所有分区。默认值:-1

  • partition_refresh_number:在单次刷新中,要刷新的最大分区数。如果要刷新的分区数超过此值,StarRocks 将拆分刷新任务并分批完成。仅当上一批分区成功刷新后,StarRocks 才会继续刷新下一批分区,直到刷新所有分区。如果任何分区刷新失败,则不会生成后续刷新任务。当值为 -1 时,刷新任务不会拆分。从 v3.3 开始,默认值从 -1 更改为 1,这意味着 StarRocks 逐个刷新分区。

  • excluded_trigger_tables:如果物化视图的基表在此处列出,则当基表中的数据发生更改时,不会触发自动刷新任务。此参数仅适用于加载触发的刷新策略,通常与属性 auto_refresh_partitions_limit 一起使用。格式:[db_name.]table_name。当值为空字符串时,所有基表中的任何数据更改都会触发相应物化视图的刷新。默认值为空字符串。

  • excluded_refresh_tables:当数据更改时,此属性中列出的基表将不会更新到物化视图。格式:[db_name.]table_name。默认值为空字符串。当值为空字符串时,任何基表数据更改都将触发相应的物化视图刷新。

    提示

    excluded_trigger_tablesexcluded_refresh_tables 之间的区别是:

    • excluded_trigger_tables 控制是否触发刷新,而不是是否参与刷新。例如,一个分区物化视图是通过连接两个分区表 A 和 B 获得的,并且表 A 和 B 的分区一一对应。excluded_trigger_table 包含表 A。在一段时间内,表 A 更新了分区 [1,2,3],但由于它是 excluded_trigger_table,因此物化视图的刷新未被触发。此时,表 B 更新分区 [3],并且物化视图触发刷新,这将刷新三个分区 [1, 2, 3]。在这里您可以看到 excluded_trigger_table 仅控制是否触发刷新。虽然表 A 的更新无法触发物化视图刷新,但当表 B 的更新触发物化视图刷新时,表 A 更新的分区也会添加到刷新任务中。
    • excluded_refresh_tables 控制是否参与刷新。在上面的示例中,如果表 A 同时存在于 excluded_trigger_tableexcluded_refresh_tables 中,则当表 B 的更新触发物化视图刷新时,只会刷新分区 [3]
  • auto_refresh_partitions_limit:触发物化视图刷新时需要刷新的最近物化视图分区的数量。您可以使用此属性来限制刷新范围并降低刷新成本。但是,由于并非所有分区都被刷新,因此物化视图中的数据可能与基表不一致。默认值:-1。当值为 -1 时,将刷新所有分区。当值为正整数 N 时,StarRocks 按时间顺序对现有分区进行排序,并刷新当前分区和 N-1 个最近的分区。如果分区的数量小于 N,则 StarRocks 会刷新所有现有分区。如果您的物化视图中存在预先创建的动态分区,StarRocks 会刷新所有预先创建的分区。

  • mv_rewrite_staleness_second:如果物化视图的上次刷新在此属性指定的时间间隔内,则无论基表中的数据是否更改,都可以直接使用此物化视图进行查询重写。如果上次刷新在此时间间隔之前,StarRocks 会检查基表是否已更新以确定是否可以使用物化视图进行查询重写。单位:秒。此属性从 v3.0 开始支持。

  • colocate_with:异步物化视图的 Colocation Group。有关更多信息,请参阅Colocate Join。此属性从 v3.0 开始支持。

  • unique_constraintsforeign_key_constraints:当您在 View Delta Join 场景中创建用于查询重写的异步物化视图时,使用的 Unique Key 约束和 Foreign Key 约束。有关更多信息,请参阅异步物化视图 - 在 View Delta Join 场景中重写查询。此属性从 v3.0 开始支持。

  • excluded_refresh_tables:当数据更改时,此属性中列出的基表不会触发到物化视图的数据刷新。此属性通常与 excluded_trigger_tables 属性一起使用。格式:[db_name.]table_name。默认值为空字符串。当值为空字符串时,所有基表中的任何数据更改都会触发相应的物化视图刷新。

    注意

    Unique Key 约束和 Foreign Key 约束仅用于查询重写。将数据加载到表中时,不保证 Foreign Key 约束检查。您必须确保加载到表中的数据满足约束。

  • resource_group:物化视图的刷新任务所属的资源组。此属性的默认值为 default_mv_wg,这是一个系统定义的资源组,专门用于物化视图刷新。default_mv_wgcpu_core_limit1mem_limit0.8。有关资源组的更多信息,请参阅资源组

  • query_rewrite_consistency:异步物化视图的查询重写规则。此属性从 v3.2 开始支持。有效值:

    • disable:禁用异步物化视图的自动查询重写。

    • checked(默认值):仅当物化视图满足时效性要求时才启用自动查询重写,这意味着:

      • 如果未指定 mv_rewrite_staleness_second,则仅当物化视图的数据与所有基表中的数据一致时,才能将其用于查询重写。
      • 如果指定了 mv_rewrite_staleness_second,则当物化视图的上次刷新在时效性时间间隔内时,可以将其用于查询重写。
    • loose:直接启用自动查询重写,无需一致性检查。

    • force_mv:从 v3.5.0 开始,StarRocks 物化视图支持 Common Partition Expression TTL。force_mv 语义专门为此场景设计。启用此语义后:

      • 如果物化视图没有 partition_retention_condition 属性,它将始终强制使用物化视图进行查询重写,无论基表是否已更新。
      • 如果物化视图具有 partition_retention_condition 属性:
        • 对于 TTL 范围内的分区,基于物化视图的查询重写始终可用,无论基表是否已更新。
        • 对于 TTL 范围外的分区,无论基表是否已更新,都需要物化视图和基表之间的 Union 补偿。

      例如,如果物化视图具有定义的 partition_retention_condition 属性,并且 20241131 的分区已过期,但 20241203 的基表数据已更新,而 20241203 的物化视图数据尚未刷新,则当 query_rewrite_consistency 属性设置为 force_mv 时,以下情况适用:

      • 物化视图保证针对 partition_retention_condition 中定义的 TTL 范围内的分区(例如,从 2024120120241203)的查询始终可以透明地重写。
      • 对于针对 partition_retention_condition 范围外的分区的查询,将根据物化视图和基表的 Union 自动进行补偿。

      有关 force_mv 语义和 partition_retention_condition 的详细说明,请参阅示例 6

  • storage_volume:如果您正在使用共享数据集群,则用于存储要创建的异步物化视图的存储卷的名称。此属性从 v3.1 开始支持。如果未指定此属性,则使用默认存储卷。示例:"storage_volume" = "def_volume"

  • force_external_table_query_rewrite:是否为基于外部 Catalog 的物化视图启用查询重写。此属性从 v3.2 开始支持。有效值:

    • true(自 v3.3 以来的默认值):为基于外部 Catalog 的物化视图启用查询重写。
    • false:禁用基于外部 Catalog 的物化视图的查询重写。

    由于无法保证基表和基于外部 Catalog 的物化视图之间的数据强一致性,因此默认情况下此功能设置为 false。启用此功能后,将根据 query_rewrite_consistency 中指定的规则使用物化视图进行查询重写。

  • enable_query_rewrite:是否使用物化视图进行查询重写。当存在许多物化视图时,基于物化视图的查询重写可能会影响优化器的耗时。使用此属性,您可以控制物化视图是否可以用于查询重写。此功能从 v3.3.0 开始支持。有效值:

    • default(默认):系统不会对物化视图执行语义检查,但只有 SPJG 类型的物化视图才能用于查询重写。请注意,如果启用了基于文本的查询重写,则也可以使用非 SPJG 类型的物化视图进行查询重写。
    • true:系统在创建或修改物化视图时会执行语义检查。如果物化视图不符合查询重写的条件(即,物化视图的定义不是 SPJG 类型的查询),则会返回失败。
    • false:物化视图将不用于查询重写。
  • [预览] transparent_mv_rewrite_mode:指定**直接针对物化视图查询**的透明重写模式。此功能从 v3.3.0 版本开始支持。有效值包括:

    • false(默认,与早期版本的行为兼容):直接针对物化视图的查询不会被重写,只会返回物化视图中已有的数据。它们的查询结果可能与基于物化视图定义的查询结果不同,具体取决于物化视图的刷新状态(数据一致性)。
    • true:直接针对物化视图的查询将被重写,并返回最新的数据,这与物化视图定义查询的结果一致。请注意,当物化视图处于非活动状态或不支持透明查询重写时,这些查询将作为物化视图定义查询执行。
    • transparent_or_error:只要符合条件,直接针对物化视图的查询都会被重写。如果物化视图处于非活动状态或不支持透明查询重写,这些查询将返回错误。
    • transparent_or_default:只要符合条件,直接针对物化视图的查询都会被重写。如果物化视图处于非活动状态或不支持透明查询重写,这些查询将返回物化视图中已有的数据。
  • partition_retention_condition:从 v3.5.0 版本开始,StarRocks 物化视图支持通用分区表达式 TTL。此属性是声明要动态保留的分区的表达式。不满足表达式中条件的分区将被定期删除。示例:'partition_retention_condition' = 'dt >= CURRENT_DATE() - INTERVAL 3 MONTH'

    • 表达式只能包含分区列和常量。不支持非分区列。
    • 通用分区表达式对 List 分区和 Range 分区的应用方式不同
      • 对于具有 List 分区的物化视图,StarRocks 支持删除通过通用分区表达式过滤的分区。
      • 对于具有 Range 分区的物化视图,StarRocks 只能使用 FE 的分区裁剪功能来过滤和删除分区。与分区裁剪不支持的谓词对应的分区无法被过滤和删除。

    有关 force_mv 语义和 partition_retention_condition 的详细说明,请参阅示例 6

query_statement (必选)

创建异步物化视图的查询语句。从 v3.1.6 版本开始,StarRocks 支持使用通用表表达式 (CTE) 创建异步物化视图。

查询异步物化视图

异步物化视图是一个物理表。您可以像操作任何常规表一样操作它,**但不能直接将数据加载到异步物化视图中**。

使用异步物化视图进行自动查询重写

StarRocks v2.5 支持基于 SPJG 类型的异步物化视图进行自动和透明的查询重写。 SPJG 类型的物化视图指的是计划仅包含 Scan、Filter、Project 和 Aggregate 类型的运算符的物化视图。 SPJG 类型的物化视图查询重写包括单表查询重写、Join 查询重写、聚合查询重写、Union 查询重写以及基于嵌套物化视图的查询重写。

有关更多信息,请参见异步物化视图 - 使用异步物化视图重写查询

支持的数据类型

  • 基于 StarRocks 默认目录创建的异步物化视图支持以下数据类型:

    • 日期:DATE, DATETIME
    • 字符串:CHAR, VARCHAR
    • 数值:BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, PERCENTILE
    • 半结构化:ARRAY, JSON, MAP(从 v3.1 开始), STRUCT(从 v3.1 开始)
    • 其他:BITMAP, HLL

注意

自 v2.4.5 起支持 BITMAP、HLL 和 PERCENTILE。

  • 基于 StarRocks 外部目录创建的异步物化视图支持以下数据类型:

    • Hive Catalog

      • 数值:INT/INTEGER, BIGINT, DOUBLE, FLOAT, DECIMAL
      • 日期:TIMESTAMP
      • 字符串:STRING, VARCHAR, CHAR
      • 半结构化:ARRAY
    • Hudi Catalog

      • 数值:BOOLEAN, INT, LONG, FLOAT, DOUBLE, DECIMAL
      • 日期:DATE, TimeMillis/TimeMicros, TimestampMillis/TimestampMicros
      • 字符串:STRING
      • 半结构化:ARRAY
    • Iceberg Catalog

      • 数值:BOOLEAN, INT, LONG, FLOAT, DOUBLE, DECIMAL(P, S)
      • 日期:DATE, TIME, TIMESTAMP
      • 字符串:STRING, UUID, FIXED(L), BINARY
      • 半结构化:LIST

使用说明

  • StarRocks 的当前版本不支持同时创建多个物化视图。只有在之前的物化视图创建完成后才能创建新的物化视图。

  • 关于同步物化视图

    • 同步物化视图仅支持对单列进行聚合函数。不支持 sum(a+b) 形式的查询语句。
    • 同步物化视图对于基础表的每个列仅支持一个聚合函数。不支持诸如 select sum(a), min(a) from table 之类的查询语句。
    • 使用聚合函数创建同步物化视图时,必须指定 GROUP BY 子句,并且在 SELECT 中至少指定一个 GROUP BY 列。
    • 同步物化视图不支持 JOIN 之类的子句以及 GROUP BY 的 HAVING 子句。
    • 使用 ALTER TABLE DROP COLUMN 删除基础表中的特定列时,必须确保基础表的所有同步物化视图都不包含已删除的列,否则,删除操作将失败。在删除列之前,必须首先删除包含该列的所有同步物化视图。
    • 为一个表创建过多的同步物化视图会影响数据加载效率。将数据加载到基础表时,同步物化视图和基础表中的数据将同步更新。如果一个基础表包含 n 个同步物化视图,则将数据加载到基础表的效率与将数据加载到 n 个表的效率大致相同。
  • 关于嵌套异步物化视图

    • 每个物化视图的刷新策略仅适用于相应的物化视图。
    • 目前,StarRocks 不限制嵌套级别的数量。在生产环境中,我们建议嵌套层数不超过三层。
  • 关于外部目录异步物化视图

    • 外部目录物化视图仅支持异步固定间隔刷新和手动刷新。
    • 物化视图和外部目录中的基础表之间不能保证严格的一致性。
    • 目前,不支持基于外部资源构建物化视图。
    • 目前,StarRocks 无法感知外部目录中的基础表数据是否已更改,因此每次刷新基础表时,默认情况下将刷新所有分区。您可以使用REFRESH MATERIALIZED VIEW手动刷新部分分区。

示例

同步物化视图示例

基础表的 Schema 如下:

mysql> desc duplicate_table;
+-------+--------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+------+---------+-------+
| k1 | INT | Yes | true | N/A | |
| k2 | INT | Yes | true | N/A | |
| k3 | BIGINT | Yes | true | N/A | |
| k4 | BIGINT | Yes | true | N/A | |
+-------+--------+------+------+---------+-------+

示例 1:创建一个仅包含原始表列(k1、k2)的同步物化视图。

create materialized view k1_k2 as
select k1, k2 from duplicate_table;

物化视图仅包含两列 k1 和 k2,没有任何聚合。

+-----------------+-------+--------+------+------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+------+---------+-------+
| k1_k2 | k1 | INT | Yes | true | N/A | |
| | k2 | INT | Yes | true | N/A | |
+-----------------+-------+--------+------+------+---------+-------+

示例 2:创建一个按 k2 排序的同步物化视图。

create materialized view k2_order as
select k2, k1 from duplicate_table order by k2;

物化视图的 Schema 如下所示。物化视图仅包含两列 k2 和 k1,其中列 k2 是一个排序列,没有任何聚合。

+-----------------+-------+--------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+-------+---------+-------+
| k2_order | k2 | INT | Yes | true | N/A | |
| | k1 | INT | Yes | false | N/A | NONE |
+-----------------+-------+--------+------+-------+---------+-------+

示例 3:创建一个按 k1 和 k2 分组的同步物化视图,以及 k3 上的 SUM 聚合。

create materialized view k1_k2_sumk3 as
select k1, k2, sum(k3) from duplicate_table group by k1, k2;

物化视图的 Schema 如下所示。物化视图包含三列 k1、k2 和 sum (k3),其中 k1、k2 是分组列,sum (k3) 是根据 k1 和 k2 分组的 k3 列的总和。

+-----------------+-------+--------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+-------+---------+-------+
| k1_k2_sumk3 | k1 | INT | Yes | true | N/A | |
| | k2 | INT | Yes | true | N/A | |
| | k3 | BIGINT | Yes | false | N/A | SUM |
+-----------------+-------+--------+------+-------+---------+-------+

由于物化视图未声明排序列,并且采用了聚合函数,因此 StarRocks 默认补充分组列 k1 和 k2。

示例 4:创建一个同步物化视图以删除重复行。

create materialized view deduplicate as
select k1, k2, k3, k4 from duplicate_table group by k1, k2, k3, k4;

物化视图的 Schema 如下所示。物化视图包含 k1、k2、k3 和 k4 列,并且没有重复行。

+-----------------+-------+--------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+-----------------+-------+--------+------+-------+---------+-------+
| deduplicate | k1 | INT | Yes | true | N/A | |
| | k2 | INT | Yes | true | N/A | |
| | k3 | BIGINT | Yes | true | N/A | |
| | k4 | BIGINT | Yes | true | N/A | |
+-----------------+-------+--------+------+-------+---------+-------+

示例 5:创建一个未声明排序列的非聚合同步物化视图。

基础表的 Schema 如下所示:

+-------+--------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-------+---------+-------+
| k1 | TINYINT | Yes | true | N/A | |
| k2 | SMALLINT | Yes | true | N/A | |
| k3 | INT | Yes | true | N/A | |
| k4 | BIGINT | Yes | true | N/A | |
| k5 | DECIMAL(9,0) | Yes | true | N/A | |
| k6 | DOUBLE | Yes | false | N/A | NONE |
| k7 | VARCHAR(20) | Yes | false | N/A | NONE |
+-------+--------------+------+-------+---------+-------+

物化视图包含 k3、k4、k5、k6 和 k7 列,并且未声明任何排序列。使用以下语句创建物化视图:

create materialized view mv_1 as
select k3, k4, k5, k6, k7 from all_type_table;

StarRocks 默认自动使用 k3、k4 和 k5 作为排序列。这三个列类型占用的字节总和为 4 (INT) + 8 (BIGINT) + 16 (DECIMAL) = 28 < 36。因此,这三个列被添加为排序列。

物化视图的 Schema 如下所示:

+----------------+-------+--------------+------+-------+---------+-------+
| IndexName | Field | Type | Null | Key | Default | Extra |
+----------------+-------+--------------+------+-------+---------+-------+
| mv_1 | k3 | INT | Yes | true | N/A | |
| | k4 | BIGINT | Yes | true | N/A | |
| | k5 | DECIMAL(9,0) | Yes | true | N/A | |
| | k6 | DOUBLE | Yes | false | N/A | NONE |
| | k7 | VARCHAR(20) | Yes | false | N/A | NONE |
+----------------+-------+--------------+------+-------+---------+-------+

可以看出,k3、k4 和 k5 列的 key 字段为 true,这表明它们是排序键。 k6 和 k7 列的 key 字段为 false,这表明它们不是排序键。

示例 6:创建一个包含 WHERE 子句和复杂表达式的同步物化视图。

-- Create the base table: user_event
CREATE TABLE user_event (
ds date NOT NULL,
id varchar(256) NOT NULL,
user_id int DEFAULT NULL,
user_id1 varchar(256) DEFAULT NULL,
user_id2 varchar(256) DEFAULT NULL,
column_01 int DEFAULT NULL,
column_02 int DEFAULT NULL,
column_03 int DEFAULT NULL,
column_04 int DEFAULT NULL,
column_05 int DEFAULT NULL,
column_06 DECIMAL(12,2) DEFAULT NULL,
column_07 DECIMAL(12,3) DEFAULT NULL,
column_08 JSON DEFAULT NULL,
column_09 DATETIME DEFAULT NULL,
column_10 DATETIME DEFAULT NULL,
column_11 DATE DEFAULT NULL,
column_12 varchar(256) DEFAULT NULL,
column_13 varchar(256) DEFAULT NULL,
column_14 varchar(256) DEFAULT NULL,
column_15 varchar(256) DEFAULT NULL,
column_16 varchar(256) DEFAULT NULL,
column_17 varchar(256) DEFAULT NULL,
column_18 varchar(256) DEFAULT NULL,
column_19 varchar(256) DEFAULT NULL,
column_20 varchar(256) DEFAULT NULL,
column_21 varchar(256) DEFAULT NULL,
column_22 varchar(256) DEFAULT NULL,
column_23 varchar(256) DEFAULT NULL,
column_24 varchar(256) DEFAULT NULL,
column_25 varchar(256) DEFAULT NULL,
column_26 varchar(256) DEFAULT NULL,
column_27 varchar(256) DEFAULT NULL,
column_28 varchar(256) DEFAULT NULL,
column_29 varchar(256) DEFAULT NULL,
column_30 varchar(256) DEFAULT NULL,
column_31 varchar(256) DEFAULT NULL,
column_32 varchar(256) DEFAULT NULL,
column_33 varchar(256) DEFAULT NULL,
column_34 varchar(256) DEFAULT NULL,
column_35 varchar(256) DEFAULT NULL,
column_36 varchar(256) DEFAULT NULL,
column_37 varchar(256) DEFAULT NULL
)
PARTITION BY date_trunc("day", ds)
DISTRIBUTED BY hash(id);

-- Create the materialized view with the WHERE clause and complex expresssions.
CREATE MATERIALIZED VIEW test_mv1
AS
SELECT
ds,
column_19,
column_36,
sum(column_01) as column_01_sum,
bitmap_union(to_bitmap( user_id)) as user_id_dist_cnt,
bitmap_union(to_bitmap(case when column_01 > 1 and column_34 IN ('1','34') then user_id2 else null end)) as filter_dist_cnt_1,
bitmap_union(to_bitmap( case when column_02 > 60 and column_35 IN ('11','13') then user_id2 else null end)) as filter_dist_cnt_2,
bitmap_union(to_bitmap(case when column_03 > 70 and column_36 IN ('21','23') then user_id2 else null end)) as filter_dist_cnt_3,
bitmap_union(to_bitmap(case when column_04 > 20 and column_27 IN ('31','27') then user_id2 else null end)) as filter_dist_cnt_4,
bitmap_union(to_bitmap( case when column_05 > 90 and column_28 IN ('41','43') then user_id2 else null end)) as filter_dist_cnt_5
FROM user_event
WHERE ds >= '2023-11-02'
GROUP BY
ds,
column_19,
column_36;

异步物化视图示例

以下示例基于以下基础表:

CREATE TABLE `lineorder` (
`lo_orderkey` int(11) NOT NULL COMMENT "",
`lo_linenumber` int(11) NOT NULL COMMENT "",
`lo_custkey` int(11) NOT NULL COMMENT "",
`lo_partkey` int(11) NOT NULL COMMENT "",
`lo_suppkey` int(11) NOT NULL COMMENT "",
`lo_orderdate` int(11) NOT NULL COMMENT "",
`lo_orderpriority` varchar(16) NOT NULL COMMENT "",
`lo_shippriority` int(11) NOT NULL COMMENT "",
`lo_quantity` int(11) NOT NULL COMMENT "",
`lo_extendedprice` int(11) NOT NULL COMMENT "",
`lo_ordtotalprice` int(11) NOT NULL COMMENT "",
`lo_discount` int(11) NOT NULL COMMENT "",
`lo_revenue` int(11) NOT NULL COMMENT "",
`lo_supplycost` int(11) NOT NULL COMMENT "",
`lo_tax` int(11) NOT NULL COMMENT "",
`lo_commitdate` int(11) NOT NULL COMMENT "",
`lo_shipmode` varchar(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`lo_orderkey`)
COMMENT "OLAP"
PARTITION BY RANGE(`lo_orderdate`)
(PARTITION p1 VALUES [("-2147483648"), ("19930101")),
PARTITION p2 VALUES [("19930101"), ("19940101")),
PARTITION p3 VALUES [("19940101"), ("19950101")),
PARTITION p4 VALUES [("19950101"), ("19960101")),
PARTITION p5 VALUES [("19960101"), ("19970101")),
PARTITION p6 VALUES [("19970101"), ("19980101")),
PARTITION p7 VALUES [("19980101"), ("19990101")))
DISTRIBUTED BY HASH(`lo_orderkey`);

CREATE TABLE IF NOT EXISTS `customer` (
`c_custkey` int(11) NOT NULL COMMENT "",
`c_name` varchar(26) NOT NULL COMMENT "",
`c_address` varchar(41) NOT NULL COMMENT "",
`c_city` varchar(11) NOT NULL COMMENT "",
`c_nation` varchar(16) NOT NULL COMMENT "",
`c_region` varchar(13) NOT NULL COMMENT "",
`c_phone` varchar(16) NOT NULL COMMENT "",
`c_mktsegment` varchar(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`c_custkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`c_custkey`);

CREATE TABLE IF NOT EXISTS `dates` (
`d_datekey` int(11) NOT NULL COMMENT "",
`d_date` varchar(20) NOT NULL COMMENT "",
`d_dayofweek` varchar(10) NOT NULL COMMENT "",
`d_month` varchar(11) NOT NULL COMMENT "",
`d_year` int(11) NOT NULL COMMENT "",
`d_yearmonthnum` int(11) NOT NULL COMMENT "",
`d_yearmonth` varchar(9) NOT NULL COMMENT "",
`d_daynuminweek` int(11) NOT NULL COMMENT "",
`d_daynuminmonth` int(11) NOT NULL COMMENT "",
`d_daynuminyear` int(11) NOT NULL COMMENT "",
`d_monthnuminyear` int(11) NOT NULL COMMENT "",
`d_weeknuminyear` int(11) NOT NULL COMMENT "",
`d_sellingseason` varchar(14) NOT NULL COMMENT "",
`d_lastdayinweekfl` int(11) NOT NULL COMMENT "",
`d_lastdayinmonthfl` int(11) NOT NULL COMMENT "",
`d_holidayfl` int(11) NOT NULL COMMENT "",
`d_weekdayfl` int(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`d_datekey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`d_datekey`);

CREATE TABLE IF NOT EXISTS `supplier` (
`s_suppkey` int(11) NOT NULL COMMENT "",
`s_name` varchar(26) NOT NULL COMMENT "",
`s_address` varchar(26) NOT NULL COMMENT "",
`s_city` varchar(11) NOT NULL COMMENT "",
`s_nation` varchar(16) NOT NULL COMMENT "",
`s_region` varchar(13) NOT NULL COMMENT "",
`s_phone` varchar(16) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`s_suppkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`s_suppkey`);

CREATE TABLE IF NOT EXISTS `part` (
`p_partkey` int(11) NOT NULL COMMENT "",
`p_name` varchar(23) NOT NULL COMMENT "",
`p_mfgr` varchar(7) NOT NULL COMMENT "",
`p_category` varchar(8) NOT NULL COMMENT "",
`p_brand` varchar(10) NOT NULL COMMENT "",
`p_color` varchar(12) NOT NULL COMMENT "",
`p_type` varchar(26) NOT NULL COMMENT "",
`p_size` int(11) NOT NULL COMMENT "",
`p_container` varchar(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`p_partkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`p_partkey`);

create table orders (
dt date NOT NULL,
order_id bigint NOT NULL,
user_id int NOT NULL,
merchant_id int NOT NULL,
good_id int NOT NULL,
good_name string NOT NULL,
price int NOT NULL,
cnt int NOT NULL,
revenue int NOT NULL,
state tinyint NOT NULL
)
PRIMARY KEY (dt, order_id)
PARTITION BY RANGE(`dt`)
( PARTITION p20210820 VALUES [('2021-08-20'), ('2021-08-21')),
PARTITION p20210821 VALUES [('2021-08-21'), ('2021-08-22')) )
DISTRIBUTED BY HASH(order_id)
PROPERTIES (
"replication_num" = "3",
"enable_persistent_index" = "true"
);

示例 1:创建一个非分区物化视图。

CREATE MATERIALIZED VIEW lo_mv1
DISTRIBUTED BY HASH(`lo_orderkey`)
REFRESH ASYNC
AS
select
lo_orderkey,
lo_custkey,
sum(lo_quantity) as total_quantity,
sum(lo_revenue) as total_revenue,
count(lo_shipmode) as shipmode_count
from lineorder
group by lo_orderkey, lo_custkey
order by lo_orderkey;

示例 2:创建一个分区物化视图。

CREATE MATERIALIZED VIEW lo_mv2
PARTITION BY `lo_orderdate`
DISTRIBUTED BY HASH(`lo_orderkey`)
REFRESH ASYNC START('2023-07-01 10:00:00') EVERY (interval 1 day)
AS
select
lo_orderkey,
lo_orderdate,
lo_custkey,
sum(lo_quantity) as total_quantity,
sum(lo_revenue) as total_revenue,
count(lo_shipmode) as shipmode_count
from lineorder
group by lo_orderkey, lo_orderdate, lo_custkey
order by lo_orderkey;

-- Use the date_trunc() function to partition the materialized view by month.
CREATE MATERIALIZED VIEW order_mv1
PARTITION BY date_trunc('month', `dt`)
DISTRIBUTED BY HASH(`order_id`)
REFRESH ASYNC START('2023-07-01 10:00:00') EVERY (interval 1 day)
AS
select
dt,
order_id,
user_id,
sum(cnt) as total_cnt,
sum(revenue) as total_revenue,
count(state) as state_count
from orders
group by dt, order_id, user_id;

示例 3:创建一个异步物化视图。

CREATE MATERIALIZED VIEW flat_lineorder
DISTRIBUTED BY HASH(`lo_orderkey`)
REFRESH MANUAL
AS
SELECT
l.LO_ORDERKEY AS LO_ORDERKEY,
l.LO_LINENUMBER AS LO_LINENUMBER,
l.LO_CUSTKEY AS LO_CUSTKEY,
l.LO_PARTKEY AS LO_PARTKEY,
l.LO_SUPPKEY AS LO_SUPPKEY,
l.LO_ORDERDATE AS LO_ORDERDATE,
l.LO_ORDERPRIORITY AS LO_ORDERPRIORITY,
l.LO_SHIPPRIORITY AS LO_SHIPPRIORITY,
l.LO_QUANTITY AS LO_QUANTITY,
l.LO_EXTENDEDPRICE AS LO_EXTENDEDPRICE,
l.LO_ORDTOTALPRICE AS LO_ORDTOTALPRICE,
l.LO_DISCOUNT AS LO_DISCOUNT,
l.LO_REVENUE AS LO_REVENUE,
l.LO_SUPPLYCOST AS LO_SUPPLYCOST,
l.LO_TAX AS LO_TAX,
l.LO_COMMITDATE AS LO_COMMITDATE,
l.LO_SHIPMODE AS LO_SHIPMODE,
c.C_NAME AS C_NAME,
c.C_ADDRESS AS C_ADDRESS,
c.C_CITY AS C_CITY,
c.C_NATION AS C_NATION,
c.C_REGION AS C_REGION,
c.C_PHONE AS C_PHONE,
c.C_MKTSEGMENT AS C_MKTSEGMENT,
s.S_NAME AS S_NAME,
s.S_ADDRESS AS S_ADDRESS,
s.S_CITY AS S_CITY,
s.S_NATION AS S_NATION,
s.S_REGION AS S_REGION,
s.S_PHONE AS S_PHONE,
p.P_NAME AS P_NAME,
p.P_MFGR AS P_MFGR,
p.P_CATEGORY AS P_CATEGORY,
p.P_BRAND AS P_BRAND,
p.P_COLOR AS P_COLOR,
p.P_TYPE AS P_TYPE,
p.P_SIZE AS P_SIZE,
p.P_CONTAINER AS P_CONTAINER FROM lineorder AS l
INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY
INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY
INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY;

示例 4:创建一个分区物化视图,并使用 str2date 将基础表的 STRING 类型分区键转换为日期类型,以便用于物化视图。


-- Hive Table with string partition column.
CREATE TABLE `part_dates` (
`d_date` varchar(20) DEFAULT NULL,
`d_dayofweek` varchar(10) DEFAULT NULL,
`d_month` varchar(11) DEFAULT NULL,
`d_year` int(11) DEFAULT NULL,
`d_yearmonthnum` int(11) DEFAULT NULL,
`d_yearmonth` varchar(9) DEFAULT NULL,
`d_daynuminweek` int(11) DEFAULT NULL,
`d_daynuminmonth` int(11) DEFAULT NULL,
`d_daynuminyear` int(11) DEFAULT NULL,
`d_monthnuminyear` int(11) DEFAULT NULL,
`d_weeknuminyear` int(11) DEFAULT NULL,
`d_sellingseason` varchar(14) DEFAULT NULL,
`d_lastdayinweekfl` int(11) DEFAULT NULL,
`d_lastdayinmonthfl` int(11) DEFAULT NULL,
`d_holidayfl` int(11) DEFAULT NULL,
`d_weekdayfl` int(11) DEFAULT NULL,
`d_datekey` varchar(11) DEFAULT NULL
) partition by (d_datekey);


-- Create the materialied view with `str2date`.
CREATE MATERIALIZED VIEW IF NOT EXISTS `test_mv`
PARTITION BY str2date(`d_datekey`,'%Y%m%d')
DISTRIBUTED BY HASH(`d_date`, `d_month`, `d_month`)
REFRESH MANUAL
AS
SELECT
`d_date` ,
`d_dayofweek`,
`d_month` ,
`d_yearmonthnum` ,
`d_yearmonth` ,
`d_daynuminweek`,
`d_daynuminmonth`,
`d_daynuminyear` ,
`d_monthnuminyear` ,
`d_weeknuminyear` ,
`d_sellingseason`,
`d_lastdayinweekfl`,
`d_lastdayinmonthfl`,
`d_holidayfl` ,
`d_weekdayfl`,
`d_datekey`
FROM
`hive_catalog`.`ssb_1g_orc`.`part_dates` ;

示例 5:在来自 Iceberg Catalog (Spark) 的基础表上创建一个带有多列分区表达式的分区物化视图。

Spark 中基础表的定义:

-- The partition expression of the base table contains multiple columns and a `days` transform.
CREATE TABLE lineitem_days (
l_orderkey BIGINT,
l_partkey INT,
l_suppkey INT,
l_linenumber INT,
l_quantity DECIMAL(15, 2),
l_extendedprice DECIMAL(15, 2),
l_discount DECIMAL(15, 2),
l_tax DECIMAL(15, 2),
l_returnflag VARCHAR(1),
l_linestatus VARCHAR(1),
l_shipdate TIMESTAMP,
l_commitdate TIMESTAMP,
l_receiptdate TIMESTAMP,
l_shipinstruct VARCHAR(25),
l_shipmode VARCHAR(10),
l_comment VARCHAR(44)
) USING ICEBERG
PARTITIONED BY (l_returnflag, l_linestatus, days(l_shipdate));

创建一个物化视图,其分区列与基础表的分区列一一映射:

CREATE MATERIALIZED VIEW test_days
PARTITION BY (l_returnflag, l_linestatus, date_trunc('day', l_shipdate))
REFRESH DEFERRED MANUAL
AS
SELECT * FROM iceberg_catalog.test_db.lineitem_days;

示例 6:创建一个分区物化视图,为其定义通用分区表达式 TTL,并启用 force_mv 语义以进行查询重写。

CREATE MATERIALIZED VIEW test_mv1 
PARTITION BY (dt, province)
REFRESH MANUAL
PROPERTIES (
"partition_retention_condition" = "dt >= CURRENT_DATE() - INTERVAL 3 MONTH",
"query_rewrite_consistency" = "force_mv"
)
AS SELECT * from t1;