StarRocks物化视图

文章目录

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

物化视图

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

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

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

相关概念

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

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

创建物化视图

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

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

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

mysql 复制代码
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天自动刷新一次。

异步物化视图本质上是一个物理表,其中存储了根据特定查询语句预先计算的完整结果集。在物化视图第一次刷新后,即可直接查询物化视图。

mysql 复制代码
select * from sale_order_mv;

因为其基表是滚动的,且我们设置的是定时更新,所以结果可能与你从基表上查询的结果不一致。这也是可以手动刷新的:

shell 复制代码
REFRESH MATERIALIZED VIEW sale_order_mv;

还有一个我们需要知道当前物化视图是否刷新完了,如果基表小的话,很快就执行完了,但我们还是需要确认下的,以防万一:

shell 复制代码
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 的话(禁用),就得启用它,不然数据无法刷新,遇到过好几次了。

mysql 复制代码
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分钟。

好处

  • 加速数据处理和查询操作:物化视图是一种预先计算和存储数据的技术,可以加速数据处理和查询操作,降低计算资源的使用,提供更高的查询并发能力。
  • 提高查询性能:物化视图可以通过查询改写来优化查询计划,提高查询性能,降低计算资源的使用。
相关推荐
煎饼小狗几秒前
Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
数据库·redis·缓存
永乐春秋17 分钟前
WEB-通用漏洞&SQL注入&CTF&二次&堆叠&DNS带外
数据库·sql
打鱼又晒网1 小时前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!1 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
在下不上天2 小时前
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
大数据·开发语言·python
tatasix2 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。2 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了2 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度2 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮2 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql