物化视图功能定义
ByteHouse 数据库中的视图(View),除了普通视图(Normal View)以外,还有一种物化视图(Materialized View)。
- 普通视图:普通视图没有真正存储数据,不占用存储空间。只是读取数据的执行操作,可以看作是一条保存过的 SQL 查询语句。
- 物化视图:物化视图存储了 SQL 查询语句包含的数据,并提供更新机制。用查询物化视图来替代直接查询数据表,可以避免对数据进行再次的计算与聚合,能够以空间换时间的方式节省查询时间,达到查询加速和简化查询逻辑的目的。
物化视图的工作原理基于查询重写机制和数据更新。查询重写机制对应用透明,数据库引擎优化器会自动选择合适的物化视图进行查询重写,无需修改原有查询语句。同时,物化视图提供自动刷新机制,确保数据的及时性和准确性。
在大数据环境下,物化视图特别适用于数据仓库和查询引擎中频繁执行的复杂查询场景。它通过以空间换时间的方式,提高查询效率,简化查询逻辑,并显著降低大型表上复杂查询的资源消耗。作为数据查询的加速器,物化视图在保持数据实时性的同时,极大地增强了数据分析效率。它优化了数据仓库中的大规模复杂查询处理,提升了整体的数据分析体验。
总的来说,物化视图通过预计算和存储查询结果,结合自动的查询重写和数据更新机制,在不改变原有查询语句的情况下,有效提升了数据库查询性能,为大数据环境下的复杂查询场景提供了强有力的支持。
基本概念
- 基表(Base Table)- 物化视图的驱动表, 异步物化视图支持 join,subquery 多表的关联查询。
- 目的表(Target Table)- 物化视图实际存储的表,一般是 AggregateMergeTree 或者 MergeTree。
- 物化视图 (Materialized View) - 逻辑概念定义基表到目的表的映射关系。
- 刷新 (Refresh) - 创建物化视图后,其中的数据仅反映创建时刻基表的状态。当基表中的数据发生变化时,需要通过刷新通过视图从基表执行查询映射到目的表。
- 查询改写(Query Rewrite)- 查询改写是指在对已构建了物化视图的基表进行查询时,系统自动判断是否可以复用物化视图中的预计算结果处理查询。如果可以复用,系统会直接从相关的物化视图读取预计算结果,以避免重复计算消耗系统资源和时间。
物化视图类型
视图类型 | 单表聚合 | 多表关联 | 查询改写 | 刷新策略 | 数据导入影响 |
---|
异步物化视图 | 是 | 是 | 是 | 异步刷新
手动刷新 | 无 |
同步物化视图 | 是 | 否 | 是 | 导入同步刷新
手动刷新 | 有 |
同步视图(Synchronous Materialized View)
特点:
- 数据实时性高:源表数据变更时,物化视图立即更新。
- 强一致性:保证源表和物化视图数据的一致性。
- 写入延迟:可能会增加源表的写入延迟。
优势:
- 数据始终保持最新状态,适用于对实时性要求极高的场景。
- 查询时可以保证获取到最新数据。
- 适合数据量相对较小,更新频率不是特别高的场景。
异步视图(Asynchronous Materialized View)
特点:
- 异步更新:源表数据变更和物化视图更新是分离的。
- 低延迟:对源表的写入几乎没有影响。
- 最终一致性:物化视图数据可能会有短暂的滞后。
优势:
- 对源表写入性能影响小,适合高并发写入场景。
- 支持更复杂的视图查询形态,查询改写匹配支持场景更多。
- 可以更好地控制资源使用,避免峰值时期的性能问题。
- 适合大规模数据处理,特别是在数据仓库和分析系统中。
- 可以通过配置参数灵活调整刷新策略,平衡实时性和系统负载。
总的来说,同步视图和异步视图各有其优势和适用场景。选择哪种类型的物化视图,需要根据具体的业务需求、数据特征和系统资源情况来权衡。在实际应用中,可能会同时使用这两种类型的视图来满足不同的需求。