物化视图是真实存储查询结果的物理表,核心价值在于以空间换时间;需合理选择ON COMMIT/ON DEMAND/FAST刷新策略,精简定义、启用查询重写并定期维护。
物化视图(Materialized View)不是普通视图,而是把查询结果**真实存储在磁盘上**的物理表。它的核心价值在于用空间换时间——提前算好、存好复杂查询结果,让后续查询飞快响应。但若不加规划,反而会拖慢写入、浪费存储、甚至返回过期数据。
明确刷新策略:按需选 ON COMMIT / ON DEMAND / FAST
刷新方式直接决定一致性、性能和资源开销:
ON COMMIT
:每次基表提交事务时自动刷新。适合对实时性要求极高、且基表更新不频繁的场景(如配置类小表)。但会显著拖慢写操作,大表慎用。
ON DEMAND
:手动触发刷新(
)。最灵活,可配合定时任务或业务低峰期执行,避免干扰OLTP;缺点是数据可能滞后。
FAST(增量刷新)
:只应用基表的变更(基于物化视图日志)。必须满足严格条件(如包含 ROWID、基表启用日志、查询不含不可重写函数等)。开启前务必用
检查是否支持。
精简定义:只保留真正需要的列和行
物化视图越“瘦”,刷新越快、存储越省、查询优化器越容易命中:
避免
,只选业务强依赖的字段;聚合类物化视图尤其要明确 GROUP BY 维度和聚合函数(如
而非
+
混用)。
用
过滤掉长期不用的冷数据(如
),并确保该条件字段上有索引。
谨慎使用连接(JOIN):多表 JOIN 的物化视图刷新成本高、依赖复杂。优先考虑单表聚合 + 应用层关联,或拆分为多个层级物化视图。
启用查询重写(Query Rewrite)并验证生效
这是物化视图发挥加速作用的关键开关——让优化器自动把原SQL重定向到物化视图,用户无感:
创建时指定
;
确保参数
(会话或系统级);
用
查看执行计划,确认出现
或访问的是物化视图名而非基表;
若未重写,检查是否因谓词不匹配(如原SQL WHERE 条件超出了物化视图的过滤范围)、函数不可重写(如
)等原因被绕过。
定期维护:监控刷新耗时、数据延迟与空间占用
物化视图不是“设好就忘”的对象,需持续观察:
查
看
和
(
表示数据过期,
才可用);
用
或 AWR 报告分析刷新作业耗时突增原因(锁争用?统计信息过期?日志膨胀?);
对长期未被查询重写命中的物化视图,及时下线——它们只在吃资源、不干活。
物化视图不是银弹,而是精准设计的数据加速构件。建之前想清楚:这个结果集是否高频查询?是否计算昂贵?能否接受一定延迟?满足这三点,再动手定义、选策略、开重写,效果立现。
DBMS_MVIEW.REFRESHDBMS_MVIEW.EXPLAIN_MVIEWSELECT *SUM(sales)AVG()COUNT()WHEREWHERE order_date >= ADD_MONTHS(SYSDATE, -12)ENABLE QUERY REWRITEQUERY_REWRITE_ENABLED = TRUEEXPLAIN PLANMATERIALIZED VIEW REWRITETO_CHAR(date_col)USER_MVIEWSLAST_REFRESH_DATESTALENESSSTALEFRESHDBA_MVIEW_ANALYSIS