同步物化视图和异步物化视图的区别是什么

【详述】


根据同步物化视图文档中的对比,同步优于异步的就是可以做到数据同步更新

但是在异步物化视图文档中写的三种更新方案中 REFRESH ASYNC也是可以做到基表变动,视图同步变动的,实际简单测试了一下也是可以的(测试时候有一个很奇怪的问题导致不可以,所以判定是特殊情况)。

那么异步物化视图既可以同步更新数据,又可以多表关联,岂不是完全可以覆盖同步的功能了

简单来说,同步物化视图是单表的,数据同步更新,维护代价小。异步物化视图是多表的,数据异步刷新,因为刷新的有一些代价,所以也需要根据场景来判断最适合的

单表的应用场景比较局限,大部分还是多表的,有没有一份文档说明了异步实时刷新的性能瓶颈或者数据量,数据逻辑要求。以及异步的大致原理(增量,全量等)

顶顶顶,求大佬解惑

  • 异步物化视图按照设置的刷新规则进行刷新,对于创建具有分区的异步物化视图,目前可以做到分区级别的增量刷新,不分区的异步物化视图每次是全量刷新。具体参考官方文档https://docs.starrocks.io/zh/docs/using_starrocks/usage/create/

  • 目前异步物化视图的刷新主要通过 insert overwrite select 来实现,使用 REFRESH ASYNC 基表每次变动物化视图就刷新一次,如果异步物化视图没有设置分区或者单个分区数据量很大,当基表实时导入频繁变动,那么就会频繁触发物化视图刷新,刷新任务压力会很大,基表实时导入数据量大的场景推荐使用 ASYNC [START (<start_time>)] EVERY(INTERVAL <interval>) : 定时刷新模式 或 MANUAL : 手动刷新模式

2赞
  1. 多个事实表关联拼接指标(假设T1,T2,T3)生成物化视图MV1,所以不适合使用excluded_trigger_tables属性,这时候如果多个表数据同时变动,那么物化视图MV1的更新是会按照多个表的触发顺序依次更新多次,还是会按照一定逻辑合并更新任务,如果是依次的,那么当资源沾满时会自动排队还是什么逻辑
  2. 对于这个压力大,数据量大的场景有没有一个大致的量化标准,例如1000w条数据对应16G内存+8核cpu就算大,也就是不同数据量对应不同的硬件配置推荐

顶顶顶

  1. 多少次变动就会触发多少次刷新任务,刷新任务会进行排队,前一个任务刷新完成后,如果检测到该物化视图排队了很多个刷新任务,会将多个刷新任务整合 做一次刷新

  2. 集群上还会有其他的写入查询任务,一般不会只做物化视图的刷新,所以硬件配置不好评估,需要根据集群负载去判断,可以参考集群的cpu 内存 磁盘io util 等的负载情况

1赞

从相关源码来看,社区似乎是打算在同步物化视图的相关接口基础上(CreateMaterializedViewStmt),另开一个新的异步物化视图调用入口(CreateMaterializedViewStatement),用于最终兼容和替换同步物化视图:



而且对于内表,异步物化视图也可以做到及时刷新(看起来类似ClickHouse的insert trigger视图),存算分离外表需要设置周期刷新间隔否则会报错:

七猫的实践分享也提到了两者的区别,同步物化视图本质上并不是像其他计算引擎那样的物理表,而是一种索引,所以和主键表是互斥的,而异步物化视图实际生成额外的物理表更符合业界对此的定义: