← 返回题目列表

Oracle 物化视图是什么?刷新方式和普通视图有什么区别?

高频 中等 第 9 / 32 题 更新于 2026/07/29
Oracle物化视图刷新查询重写

简化版

普通视图只保存查询定义,每次访问都执行底层 SQL;物化视图保存查询结果,查询快但需要刷新。Oracle 物化视图可用于报表汇总、复制、查询重写,刷新方式包括 complete、fast、force,以及 on demand 和 on commit。是否能 fast refresh 取决于物化视图日志和查询复杂度。

详细版

物化视图适合读多写少、允许延迟的聚合或复杂 join 场景。核心点:

  • 存储结果,占空间。
  • 可建索引,提高查询速度。
  • 刷新会消耗资源。
  • fast refresh 需要物化视图日志。
  • on commit 刷新实时性好但影响事务提交。
  • on demand 适合定时批量刷新。

面试重点是:物化视图用存储和刷新成本换查询速度,不是普通视图的简单别名。

完整版教学

一、普通视图和物化视图区别在是否存结果

普通视图保存 SQL 定义,不保存结果。每次查询普通视图,本质上还是执行底层查询。物化视图会把查询结果落盘,查询时直接读结果。

普通视图:保存 SQL
物化视图:保存 SQL 结果

如果一个报表要每天查 1 亿行聚合,普通视图每次都算会很重,物化视图可以提前把结果算好。

记忆钩子:物化视图是“预计算结果表”,不是普通视图换个名字。

二、物化视图适合汇总和复杂查询

典型场景是销售日报、库存汇总、用户行为聚合、多表 join 结果缓存。它们查询频繁、计算复杂,但允许分钟级或小时级延迟。

create materialized view mv_sales_day
as
select trunc(created_at) day, sum(amount) amount
from orders
group by trunc(created_at);

查询报表时直接查 mv_sales_day,避免每次扫描订单明细。

三、刷新方式要分 complete、fast 和 force

Complete refresh 会重新执行查询并重建物化视图结果,简单但成本高。Fast refresh 只增量刷新变化部分,效率更好,但前提条件更多。Force refresh 会优先尝试 fast,不行再 complete。

刷新方式特点适合场景
complete全量刷新数据量小或低频刷新
fast增量刷新大表、变化量小
force自动选择希望兼顾但需验证

面试中要说明 fast refresh 不是想用就能用,依赖物化视图日志和查询形态。

四、on commit 和 on demand 是刷新时机

刷新方式说明“怎么刷新”,刷新时机说明“什么时候刷新”。on commit 表示基表提交时刷新,实时性好,但会增加提交开销。on demand 表示手动或定时刷新,实时性弱但可控。

on commit: 写事务提交时刷新,适合小规模强实时汇总
on demand: 定时任务刷新,适合报表和大批量统计

大多数报表场景更偏 on demand,因为可以放低峰刷新,避免影响 OLTP 提交。

五、物化视图日志支持增量刷新

Fast refresh 需要知道基表发生了哪些变化,物化视图日志就是用来记录这些变化的辅助对象。

create materialized view log on orders
with rowid, sequence (amount, created_at)
including new values;

没有足够日志信息,数据库无法只刷新增量,就只能全量刷新。日志本身也有写入和存储成本,所以要评估读写比例。

六、查询重写可以透明使用物化视图

Oracle 支持 Query Rewrite。在满足条件时,用户查询基表聚合,优化器可以自动改写为查询物化视图。

用户 SQL 查 orders 聚合
优化器发现 mv_sales_day 可用
自动改写为查 mv_sales_day

这对报表性能很有价值,但依赖参数、约束、统计信息和物化视图定义。不能只建了物化视图就假设一定会查询重写。

七、常见误区与追问

  • 误区:物化视图一定实时。 它是否实时取决于刷新时机,on demand 会有延迟。
  • 误区:fast refresh 一定可用。 它要求物化视图日志和查询满足增量刷新条件。
  • 误区:物化视图不占空间。 它保存结果,并且可以有索引,空间成本要评估。
  • 追问:on commit 有什么风险? 会增加基表事务提交开销,写频繁场景可能影响 OLTP。
  • 追问:complete refresh 和 fast refresh 区别? 前者全量重算,后者基于变化增量刷新。
  • 追问:查询重写是什么? 优化器把对基表的查询自动改写为对物化视图的查询。

八、面试中可以这样落地

如果设计销售日报,可以用订单表创建按天聚合的物化视图,on demand 每 5 分钟或每天低峰刷新,并为日期列建索引。

begin
  dbms_mview.refresh('MV_SALES_DAY', method => 'F');
end;
/

如果刷新失败或不满足 fast 条件,就评估 complete 刷新窗口,或者改为自建汇总表增量维护。

九、加强记忆

Oracle 物化视图记住“存结果、要刷新、可增量、可重写”。普通视图实时但不存结果,物化视图查询快但有延迟和刷新成本。面试时把 refresh method、refresh timing、materialized view log、query rewrite 四个点带上就够扎实。