物化视图文档,更多的可以去官方文档了解,写得很详细。
物化视图(Materialized View)是一种预先计算和存储数据的技术,可以加速数据处理和查询操作,降低计算资源的使用,提供更高的查询并发能力。简单来说它包含了一个查询结果的预计算数据。这个概念与普通视图不同,普通视图是虚拟的,不存储数据,每次查询都需要动态计算。
在 StarRocks 中,物化视图可以分为同步和异步两种类型,自 2.4 版本起,StarRocks 支持异步物化视图。
相关概念
物化视图涉及几个概念,包括基表、刷新和查询改写。
在 StarRocks 中定义物化视图通常遵循以下步骤:
CREATE MATERIALIZED VIEW
语句来创建一个物化视图。指定视图的名称、列、聚合类型以及来自哪个表。这里举例异步物化视图,因为我用得比较多:
CREATE MATERIALIZED VIEW sale_order_mv
DISTRIBUTED BY HASH(event_date)
REFRESH ASYNC START('2021-07-24 04:15:00') EVERY (interval 1 day)
AS SELECT event_date, product_id, sum(amount) as total_sales from sale_order group by product_id;
你可以看到,创建时的语法跟 mysql 的很像,所以 mysql 的大部分语法它都支持,这很好。当然 Starrocks 也有一些函数,比如我用得最多的 JSON 函数(parse_json
),大家可以参考文档,这里不多介绍。函数参考
对于我这里为什么不用同步物化视图,因为需求并不需要实时刷新数据,以需求为准。
还有命名为:sale_order_mv
,是为了方便我区分哪个是物化视图,这个无限制,看个人喜好。
解释下这个 REFRESH ASYNC START('2021-07-24 04:15:00') EVERY (interval 1 day)
是异步物化视图的刷新方式,其中START参数指定了刷新任务的起始时间,EVERY参数指定了刷新任务的间隔时间。在这个例子中,物化视图会在2021-07-24 04:15:00
开始刷新,每隔1天自动刷新一次。
异步物化视图本质上是一个物理表,其中存储了根据特定查询语句预先计算的完整结果集。在物化视图第一次刷新后,即可直接查询物化视图。
select * from sale_order_mv;
因为其基表是滚动的,且我们设置的是定时更新,所以结果可能与你从基表上查询的结果不一致。这也是可以手动刷新的:
REFRESH MATERIALIZED VIEW sale_order_mv;
还有一个我们需要知道当前物化视图是否刷新完了,如果基表小的话,很快就执行完了,但我们还是需要确认下的,以防万一:
SHOW MATERIALIZED VIEWS WHERE NAME = "sale_order_mv"\G;
result:
*************************** 1. row ***************************
id: 211660
database_name: cc_event_log
name: sale_order_mv
refresh_type: ASYNC
is_active: true
partition_type: UNPARTITIONED
task_id: 316890
task_name: mv-211660
last_refresh_start_time: 2022-01-23 04:15:00
last_refresh_finished_time: 2022-01-23 04:15:17
last_refresh_duration: 17
last_refresh_state: SUCCESS
last_refresh_force_refresh: false
last_refresh_start_partition:
last_refresh_end_partition:
last_refresh_mv_refresh_partitions: sale_order_mv
last_refresh_error_code: 0
last_refresh_error_message:
rows: 327885569
text:
注意: 这里有几个需要我们关注的指标 is_active
, last_refresh_state
, last_refresh_error_code
,下面分别说下。
如果你的物化视图是正常的,但这里 is_active 是 false 的话(禁用),就得启用它,不然数据无法刷新,遇到过好几次了。
ALTER MATERIALIZED VIEW sale_order_mv ACTIVE;
last_refresh_state 与 last_refresh_error_code,看词就知道是什么意思了,一个是最近一次刷新状态是否成功,一个是最近一次刷新的的错误码,错误码非 0 代表有错误产生,可以看下 last_refresh_error_message 具体信息,我遇到的大多数是硬盘空间不足或者是刷新超时(query_timeout),Starrocks 的 query_timeout 当前默认是 300 s,即5分钟。