StarRocks 物化视图怎么用?同步和异步有什么区别?
湖仓与 OLAP第 25 / 34 题
自测:先别看答案
试着用 1~2 分钟把这道题讲出来(说出声或写下要点),再展开对照。
面试怎么回答
同步物化视图建在单表上,和基表在同一事务里更新、数据强一致,适合单表预聚合或换排序键;异步物化视图支持多表 JOIN 和外部表,按手动、定时或基表变化刷新,可以按分区增量刷新,适合宽表和汇总层,但刷新前数据有延迟。两者都支持查询自动改写,业务 SQL 写基表即可。我会从慢查询日志里挑高频固定模式的查询建物化视图,并持续看命中率和刷新开销。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
报表查询太慢,面试官会问:能不能用物化视图?同步物化视图和异步物化视图有什么区别?查询怎么自动用上它?
同步物化视图
建在单张表上,可以看作这张表的一个预聚合或换了排序键的副本。基表导入数据时,物化视图在同一个事务里同步更新,数据始终和基表一致。
适用场景:单表上固定维度的预聚合,或者需要另一种排序键来加速某类过滤查询。
限制:只能基于单表,支持的聚合函数和表达式有限。
异步物化视图
可以基于多表 JOIN、复杂聚合,甚至外部表(如 Hive、Iceberg)创建。数据按设定的策略刷新:手动、定时,或者基表变化后触发;分区表可以只刷新发生变化的分区。
适用场景:多表关联后的宽表、跨层的汇总表、加速湖上数据的查询,相当于在 OLAP 引擎里做一部分数仓建模。
需要注意的是数据新鲜度:刷新之前,物化视图的数据会落后于基表。
查询改写
用户的 SQL 仍然写在基表上,优化器判断某个物化视图能回答这个查询(或其中一部分)时,会自动改写成查物化视图。业务方不用改 SQL,这是物化视图比手工建汇总表更好用的地方。
要让改写生效,物化视图的维度和聚合要能覆盖查询;对于异步物化视图,还要考虑能否接受数据有延迟。
怎么用好
- 从慢查询日志里找出高频、模式固定的查询,再针对性建物化视图,不要一开始就建很多。
- 物化视图会占用存储,也会消耗刷新资源,要定期检查命中率,清理不用的。
- 分区表尽量用分区级增量刷新,避免每次全量重算。