物化视图(Materialized View)是一种预先计算并存储查询结果的数据库对象,能够显著提升复杂查询的性能。SelectDB提供同步物化视图和异步物化视图两类,分别适用于不同的业务场景。
使用场景
物化视图主要适用于以下三类场景:
-
查询加速:对于包含复杂聚合、多表JOIN的高频查询,预先将计算结果物化存储,查询时直接读取物化结果,避免重复计算,大幅降低查询延迟。
-
轻量ETL(数据加工):物化视图可以作为轻量级的ETL工具,对原始数据进行预聚合、转换,为下游报表或分析提供加工后的数据层,实现数仓分层建设。
-
湖仓一体加速:对于存储在数据湖(如Hive、Iceberg等)中的外部数据,通过异步物化视图将常用查询结果缓存到SelectDB本地存储,利用SelectDB的高性能引擎加速数据湖查询。
物化视图分类
SelectDB提供两类物化视图,分别适用于不同的使用场景:
同步物化视图
同步物化视图(Sync Materialized View)在基表数据写入时实时同步更新,保证物化视图数据与基表数据强一致。其特点如下:
-
实时一致性:基表的每次写入操作都会同步更新物化视图,查询结果始终与基表保持一致。
-
仅支持单表:同步物化视图只能基于单张基表创建,不支持多表JOIN。
-
自动透明改写:查询优化器可以自动识别并使用同步物化视图加速查询,无需修改SQL语句。
-
适用场景:对数据实时性要求高的聚合加速查询,如实时大屏、在线报表等。
异步物化视图
异步物化视图(Async Materialized View)采用异步刷新机制,通过刷新方式(全量刷新或分区增量刷新)和触发方式(手动、定时或提交触发)的灵活组合,满足不同业务场景的数据时效性需求。其特点如下:
-
支持多表JOIN:异步物化视图可以基于多张表(包括内表和外表)创建,支持复杂的JOIN查询预计算。
-
灵活刷新策略:支持手动刷新(ON MANUAL)、定时刷新(ON SCHEDULE)和提交触发刷新(ON COMMIT)三种触发方式,可根据数据时效性需求灵活配置。
-
湖仓一体支持:支持基于Hive、Iceberg等外部数据源创建物化视图,加速数据湖查询。
-
透明改写:查询优化器支持基于SPJG(SELECT-PROJECT-JOIN-GROUP-BY)算法的透明改写,自动将原始查询路由到物化视图,无需修改业务SQL。
-
适用场景:对数据时效性要求相对宽松(T+1级别)、查询复杂度高的分析场景,如数仓分层、多维度报表等。
同步与异步物化视图对比
|
对比维度 |
同步物化视图 |
异步物化视图 |
|
数据一致性 |
强一致(实时同步) |
最终一致(异步刷新) |
|
支持的基表数量 |
仅单表 |
多表(含JOIN) |
|
外表支持 |
不支持 |
支持(Hive、Iceberg等) |
|
刷新方式 |
写时同步更新 |
全量刷新(COMPLETE)或分区增量刷新(AUTO) |
|
触发方式 |
自动(写入时同步触发) |
手动(ON MANUAL)/ 定时(ON SCHEDULE)/ 提交触发(ON COMMIT) |
|
透明改写 |
支持 |
支持(SPJG算法) |
|
适用场景 |
实时性要求高、单表聚合加速 |
T+1分析、多表JOIN预计算、湖仓加速 |
异步物化视图的刷新机制
异步物化视图的刷新由两个独立维度决定:刷新方式(每次刷新的范围)和触发方式(何时触发刷新)。两者可以自由组合,在创建物化视图时通过REFRESH子句指定。
刷新方式(refresh_method)
刷新方式决定每次刷新时的数据范围:
|
刷新方式 |
刷新范围 |
说明 |
|
全量刷新(COMPLETE) |
全部数据 |
每次刷新时重新计算物化视图定义SQL涉及的所有数据并完整写入。适用于非分区表或需要完全重建数据的场景。 |
|
分区增量刷新(AUTO) |
变化的分区 |
仅刷新自上次刷新后数据发生变化的分区,刷新开销低。如果系统无法感知分区变化,则自动退化为全量刷新。适合分区表场景。 |
触发方式(refresh_trigger)
触发方式决定何时启动刷新任务。以下三种触发方式均可与上述任意刷新方式组合使用:
|
触发方式 |
触发时机 |
说明 |
适用场景 |
|
手动触发(ON MANUAL) |
用户手动执行 |
通过 |
需要精确控制刷新时机的场景 |
|
定时触发(ON SCHEDULE) |
按设定的时间间隔 |
按指定的时间间隔(分钟、小时、天等)自动触发刷新 |
周期性数据更新的场景,如每日报表 |
|
提交触发(ON COMMIT) |
基表数据变更后 |
基表数据提交后自动触发物化视图刷新,数据延迟最低 |
基表变更频率不高且对数据新鲜度要求较高的场景 |
刷新方式和触发方式是两个独立的维度。例如,您可以配置"全量刷新 + 定时触发"(每天凌晨全量重建),也可以配置"分区增量刷新 + 提交触发"(基表变更后仅刷新受影响的分区)。