在《极致性能背后的黑科技?这个世上没有"银弹"!(一)》中,我们从"越多的并发处理,越快的速度"这一视角,探讨了通过MPP架构,pipeline引擎,向量化执行等提升查询性能的思路。更多线程、更高效的资源调度,能够显著缩短响应时间,但受限于机器硬件和任务拆分粒度,性能提升并非无上限。
在《极致性能背后的黑科技?这个世上没有"银弹"!(二)》中,我们从"越少无效的数据参与计算,越快的速度"这一视角,介绍了LSM树,列式存储,读写权衡中Delete and insert架构,索引,RuntimeFilter是如何通过减少无效数据的参与从而进一步提升查询性能。然而,当业务SQL逻辑复杂、查询必须涉及全量数据时,单纯减少数据参与计算的策略可能无能为力。
那么,在机器资源有限、查询逻辑不可避免地需要全量数据参与计算的情况下,如何进一步提升查询速度?答案是物化视图,一种通过"以空间换时间"的策略,通过预计算和存储中间结果来大幅加速查询。StarRocks作为一款高性能分析引擎,号称在某些场景下能实现10倍以上的性能提升,而物化视图正是其核心"黑科技"之一。
物化视图:以空间换时间的性能利器
物化视图(本文主要指异步物化视图) 本质上是一种预先计算并存储的查询结果表。与传统视图(仅保存查询逻辑,运行时动态计算)不同,物化视图将查询结果以物理表的形式存储在数据库中,供后续查询直接使用。这种"预计算"策略的核心思想是用额外的存储空间换取更快的查询响应时间。
物化视图的工作原理
-
预计算:根据业务需求,定义一个物化视图,说白了,就是起一个定时调度SQL,指定其对应的SQL查询逻辑(例如,聚合、过滤或连接操作)。StarRocks会在数据更新时(调度策略)提前执行该查询,并将结果存储为物化视图表。
-
增量更新:当底层数据发生变化时,物化视图支持增量更新,仅对变化的数据重新计算,从而避免全量重算的性能开销。比如有小时分区,这时候可以按小时进行增量计算,前提是之前的小时分区的数据不再更新。
-
查询重定向:当用户提交与物化视图逻辑匹配的查询时,StarRocks会自动识别并直接从物化视图中读取预计算结果,而无需重新执行复杂的原始查询。例如,当用户执行一个复杂的聚合查询时,StarRocks会检查是否有对应的物化视图存储了预聚合结果,若存在,则直接返回结果,极大地减少计算量。
物化视图的优势
- 性能提升:通过预计算,复杂的聚合、连接等操作只需执行一次,后续查询直接读取结果,显著降低计算开销。
- 透明性:用户无需修改原有SQL,StarRocks会根据SQL自动匹配物化视图,提升查询性能。
物化视图的代价
-
存储开销:预计算结果需要额外的存储空间,尤其是当物化视图涉及大量数据时。
-
计算开销:数据更新时,物化视图需要同步刷新,可能带来额外的计算和延迟。
物化视图的适用场景
物化视图并非万能,其效果在特定场景下尤为显著。以下是几种典型的应用场景:
- 高频聚合查询:如BI报表、仪表盘等场景,用户反复查询相同维度的聚合结果。通过物化视图预计算聚合结果,可将查询时间从分钟级降到毫秒级。
- 实时数据分析:在流式数据处理场景(如实时监控、用户行为分析),物化视图可以结合增量更新机制,快速响应高并发查询。
- 复杂多表连接:当查询涉及多个大表的连接操作时,物化视图可预先完成连接并存储结果,显著降低查询时的计算开销。
- 数据仓库优化:在数据仓库中,物化视图可用于构建中间层,如ODS到DWD的转换,减少ETL过程中的重复计算。
举个例子:按小时计算广告展示量、点击量、转化量等核心指标,评估广告近实时的投放效果。由于数据源是基于外部表,天级分区数据大小是TP级别,同时业务逻辑涉及到多表join,在资源有限的前提下,正常查一天的数据需要1~2分钟才能查出来。
如果改用异步物化视图实现,按小时分区进行增量更新(前提是基表历史分区数据不再被更新),用户在异步物化视图基础上进行查询,查询的速度是毫秒级。甚至在用户不知道异步物化视图的前提下,只要查询能命中视图,也是能达到毫秒级别的速度。类似的查询需求越多,对计算资源节省的效果越好。从理论上来说,均摊到12个小时执行12次跟一次查询一天分区相比,计算资源的利用率也能得到提升。
物化视图的非适用场景
-
复杂查询:如果查询模式变化频繁,没法命中物化视图,物化视图的维护成本可能高于其带来的性能收益。
-
低频查询:当查询不常重复时,只是偶尔的一两次查询,预计算的存储和维护开销可能得不偿失。
-
原始表不是增量更新,每次需要进行全量计算,对计算资源的开销大。
总结
在机器资源有限、业务SQL逻辑需要全量数据参与计算的场景下,物化视图通过"以空间换时间"的策略,为查询性能优化提供了强有力的解决方案。StarRocks凭借物化视图及其智能查询重写、增量更新实现了在高并发、实时分析场景下的10倍+甚至更大的性能提升。 ** 更多大数据干货,欢迎关注我的微信公众号---BigData共享**