文章目录

      • 物化视图
      • 创建物化视图
      • 好处

物化视图文档,更多的可以去官方文档了解,写得很详细。

物化视图

物化视图(Materialized View)是一种预先计算和存储数据的技术,可以加速数据处理和查询操作,降低计算资源的使用,提供更高的查询并发能力。简单来说它包含了一个查询结果的预计算数据。这个概念与普通视图不同,普通视图是虚拟的,不存储数据,每次查询都需要动态计算。

在 StarRocks 中,物化视图可以分为同步和异步两种类型,自 2.4 版本起,StarRocks 支持异步物化视图

  • 同步物化视图:是指物化视图与基表的数据保持实时同步,即基表数据更新后,物化视图立即进行更新。
  • 异步物化视图:是在基表数据更新后,通过定时任务或者触发条件来触发物化视图的更新,因此在某个时间点上,物化视图的数据可能与基表存在一定的延迟。

相关概念

物化视图涉及几个概念,包括基表、刷新和查询改写。

  • 基表(Base Table):基表是物化视图的数据来源,它可以是一个或多个表。
  • 刷新(Refresh):物化视图的刷新是指更新物化视图中的数据,使其与基表的数据保持同步。在 StarRocks 中,刷新可以分为同步和异步两种方式。同步刷新是指物化视图与基表的数据保持实时同步,而异步刷新则是在基表数据更新后,通过定时任务(ASYNC)或者手动(MANUAL)触发物化视图的更新,因此在某个时间点上,物化视图的数据可能与基表存在一定的延迟。
  • 查询改写(Query Rewrite):查询改写是指在对已构建了物化视图的基表进行查询时,系统自动判断是否可以复用物化视图中的预计算结果处理查询。如果可以复用,系统会直接从相关的物化视图读取预计算结果,以避免重复计算消耗系统资源和时间。

创建物化视图

在 StarRocks 中定义物化视图通常遵循以下步骤:

  1. 创建物化视图: 使用 CREATE MATERIALIZED VIEW 语句来创建一个物化视图。指定视图的名称、列、聚合类型以及来自哪个表。
  2. 指定查询: 在创建语句中,你需要指定物化视图的查询逻辑。这通常涉及到选择哪些列,以及如何聚合数据。
  3. 刷新物化视图: 物化视图可以根据需要定期刷新,以确保它们包含最新的数据。在某些系统中,这可以是自动或手动或通过计划任务进行。

这里举例异步物化视图,因为我用得比较多:

CREATE MATERIALIZED VIEW sale_order_mvDISTRIBUTED 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_logname: sale_order_mvrefresh_type: ASYNC is_active: truepartition_type: UNPARTITIONED task_id: 316890 task_name: mv-211660 last_refresh_start_time: 2022-01-23 04:15:00last_refresh_finished_time: 2022-01-23 04:15:17 last_refresh_duration: 17last_refresh_state: SUCCESSlast_refresh_force_refresh: falselast_refresh_start_partition:last_refresh_end_partition:last_refresh_mv_refresh_partitions: sale_order_mv last_refresh_error_code: 0last_refresh_error_message:rows: 327885569text:

注意: 这里有几个需要我们关注的指标 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分钟。

好处

  • 加速数据处理和查询操作:物化视图是一种预先计算和存储数据的技术,可以加速数据处理和查询操作,降低计算资源的使用,提供更高的查询并发能力。
  • 提高查询性能:物化视图可以通过查询改写来优化查询计划,提高查询性能,降低计算资源的使用。