在数据库设计中,SQL视图和物化视图都能简化复杂查询并提升可读性,但它们在刷新代价与查询一致性上的表现完全不同。理解这些差异,是做合理架构选择的前提。

什么是SQL视图
SQL视图是一个虚拟表,它本身不保存任何数据,只是把一条查询语句固化下来。每次访问视图时,数据库都会重新执行定义中的SELECT语句,并从基表中实时取出数据。
简单视图示例
-- 创建一个普通视图,实时统计用户订单数 CREATE VIEW user_order_count AS SELECT user_id, COUNT(*) AS order_num FROM orders GROUP BY user_id;
什么是物化视图
物化视图则是把查询的结果真正存储到磁盘上,像一张普通表那样保留数据。它在创建或刷新时执行一次查询并落盘,后续读取直接扫描已存的结果,不再实时访问基表。
创建物化视图并刷新
-- 创建物化视图 CREATE MATERIALIZED VIEW mv_user_order_count AS SELECT user_id, COUNT(*) AS order_num FROM orders GROUP BY user_id; -- 基表变化后手动刷新 REFRESH MATERIALIZED VIEW mv_user_order_count;
刷新代价对比
SQL视图没有刷新概念,因为它不存数据,代价为零,但每次查询都要承担底层SQL的执行成本。物化视图需要占用存储空间,并且在基表发生增删改后必须刷新,刷新可分为全量刷新和增量刷新,都会消耗IO与CPU。
| 类型 | 存储开销 | 查询开销 | 刷新开销 |
|---|---|---|---|
| SQL视图 | 无 | 高(实时计算) | 无 |
| 物化视图 | 有 | 低(读结果) | 有(需刷新) |
查询一致性对比
由于SQL视图每次都重新查基表,它能保证读到的是最新已提交数据,具备强一致性。物化视图只在刷新时刻与基表一致,若刷新不及时,用户就可能读到过期数据,属于最终一致性。
如果业务要求随时看到精确实时报表,SQL视图更合适;若容忍秒级或分钟级延迟且追求查询性能,物化视图优势明显。
如何选择
- 读多写少、对时效性要求宽松:优先物化视图
- 写多读少、要求实时准确:使用SQL视图
- 中间层聚合计算重、基表变化不频繁:物化视图收益大
综合来看,SQL视图和物化视图并非互斥,实际系统中常混合使用,用视图保准确,用物化视图扛压力。