物化视图文档,更多的可以去官方文档了解,写得很详细。
物化视图
物化视图(Materialized View)是一种预先计算和存储数据的技术,可以加速数据处理和查询操作,降低计算资源的使用,提供更高的查询并发能力。简单来说它包含了一个查询结果的预计算数据。这个概念与普通视图不同,普通视图是虚拟的,不存储数据,每次查询都需要动态计算。
在 StarRocks 中,物化视图可以分为同步和异步两种类型,自 2.4 版本起,StarRocks 支持异步物化视图。
- 同步物化视图:是指物化视图与基表的数据保持实时同步,即基表数据更新后,物化视图立即进行更新。
- 异步物化视图:是在基表数据更新后,通过定时任务或者触发条件来触发物化视图的更新,因此在某个时间点上,物化视图的数据可能与基表存在一定的延迟。
相关概念
物化视图涉及几个概念,包括基表、刷新和查询改写。
- 基表(Base Table):基表是物化视图的数据来源,它可以是一个或多个表。
- 刷新(Refresh):物化视图的刷新是指更新物化视图中的数据,使其与基表的数据保持同步。在 StarRocks 中,刷新可以分为同步和异步两种方式。同步刷新是指物化视图与基表的数据保持实时同步,而异步刷新则是在基表数据更新后,通过定时任务(ASYNC)或者手动(MANUAL)触发物化视图的更新,因此在某个时间点上,物化视图的数据可能与基表存在一定的延迟。
- 查询改写(Query Rewrite):查询改写是指在对已构建了物化视图的基表进行查询时,系统自动判断是否可以复用物化视图中的预计算结果处理查询。如果可以复用,系统会直接从相关的物化视图读取预计算结果,以避免重复计算消耗系统资源和时间。
创建物化视图
在 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 的话(禁用),就得启用它,不然数据无法刷新,遇到过好几次了。文章来源:https://www.toymoban.com/news/detail-823064.html
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分钟。文章来源地址https://www.toymoban.com/news/detail-823064.html
好处
- 加速数据处理和查询操作:物化视图是一种预先计算和存储数据的技术,可以加速数据处理和查询操作,降低计算资源的使用,提供更高的查询并发能力。
- 提高查询性能:物化视图可以通过查询改写来优化查询计划,提高查询性能,降低计算资源的使用。
到了这里,关于StarRocks物化视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!