普通视图不存储数据,每次查询动态执行SQL;物化视图存储实际数据,需手动刷新,查询更快但可能过期。

在 PostgreSQL 中,视图(View)是一种虚拟表,它基于 SQL 查询的结果集呈现数据。PostgreSQL 提供了两种主要类型的视图:普通视图(Regular View)和物化视图(Materialized View)。它们在性能、数据一致性、使用场景等方面存在显著差异。下面将从多个维度对两者进行详细分析。
1. 数据存储方式不同
普通视图 并不存储实际的数据。它只是一个保存的查询语句,每次访问视图时,系统都会重新执行其定义的 SELECT 查询,从底层基表中动态获取最新数据。
物化视图 则会将查询结果实际存储在磁盘上,相当于创建了一张物理表来保存查询快照。这意味着物化视图拥有自己的数据副本,与基表独立存在。
举例说明:- 你创建一个视图用于统计订单总额,普通视图每次调用都实时计算;而物化视图只在刷新时计算一次,后续读取直接返回缓存结果。
2. 查询性能对比
由于普通视图每次访问都需要重新执行原始查询,特别是当涉及多表连接、聚合函数或复杂条件时,可能带来较大的性能开销。
物化视图因为已有预计算结果,查询速度通常更快,适合频繁读取但更新不频繁的场景。
- 普通视图:适合数据实时性要求高的场景,但性能依赖原查询复杂度。
- 物化视图:适合报表、数据分析等读多写少的场景,能显著提升响应速度。
3. 数据一致性与时效性
普通视图始终反映基表的当前状态,只要基表数据发生变化,视图查询结果立即体现变更,具备强一致性。
物化视图的数据是静态的,不会自动同步基表的变化。必须手动执行 REFRESH MATERIALIZED VIEW 命令才能更新内容。在此期间,物化视图中的数据可能是过期的。
- 若业务不能容忍延迟,应避免使用物化视图。
- 可通过定时任务(如 cron 或 pg_cron 扩展)定期刷新物化视图,平衡性能与时效。
4. 更新与维护机制
普通视图无法被直接更新(INSERT/UPDATE/DELETE),除非定义了 INSTEAD OF 触发器。所有修改操作仍需作用于基表。
物化视图也不支持直接写入操作。刷新操作有两种模式:
- REFRESH MATERIALIZED VIEW mv_name; —— 锁定整个视图并重建数据。
- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_name; —— 允许并发查询下刷新,但要求物化视图包含唯一索引(如主键),防止数据冲突。
5. 索引支持能力
普通视图不能在其上创建索引,因为它本身没有物理存储。优化只能通过在基表上建立合适索引来实现。
物化视图作为物理对象,可以像普通表一样创建索引,极大提升查询效率。
- 例如,在物化视图的“用户地区”字段上创建 B-tree 索引,可加速按地区筛选的速度。
6. 使用场景建议
根据特性差异,合理选择视图类型至关重要:
- 使用普通视图:需要实时数据、逻辑封装复杂查询、简化权限管理、构建可复用的查询模块。
- 使用物化视图:用于数据仓库、BI 报表、聚合分析、外部系统对接等对性能敏感且允许轻微延迟的场景。
基本上就这些。理解普通视图和物化视图的核心区别,有助于在实际开发中做出更合理的架构决策。关键在于权衡“实时性”与“性能”,并结合业务需求灵活应用。不复杂但容易忽略的是刷新策略和索引设计,这往往是物化视图能否发挥优势的关键。










