一、定义
视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。对一个物化视图查询的执行效率与查询一个表是一样的。
二、语法
sql
CREATE METERIALIZED VIEW view_name
[ BUILD IMMEDIACE | IBUILD DEFERRED ]
REFRESH [ FAST | COMPLETE | FORCE]
[
ON [COMMIT | DEMAND ] | START WITH (start time) NEXT(next time)
]
As subquery
BUILD IMMEDIATE
: 是在建物化视图的时候就生成数据
BUILD DEFERRED
: 在创建时不生成数据,以后根据需要再生成数据 默认为BUILD IMMEDIATE
刷新(REFRESH
):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。
REFRESH后跟着指定的刷新方法有三种 FAST
, COMPLETE
, FORCE
FAST
刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE
刷新对整个物化视图进行完全的刷新.- 如果选择
FORCE
方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式否则采用COMPLETE的方式。FORCE是默认的方式.
刷新的模式有两种: ONDEMAND
和 ONCOMMIT
。
ON DEMAND
指需要手动刷新物化视图(默认)ON COMMIT
指在基表发生COMMIT操作时自动刷新。
三、案例
3.1 创建手动刷新的物化视图
3.1.1 需求
连接如下两张表
3.1.2 语句
创建时若出现权限不足,可参考:ORA-01031:insufficient privileges - 掘金 (juejin.cn)
此外,生成物化视图之外,还生成了对应的一张表。
这是物化视图的定义:物化视图的实质通过查询去更新一张表,存储结构和表一模一样。
3.1.3 特性测试
向基表中插入一条数据
视图中却并不存在
默认为手动刷新(on demand),无法自动更新
可执行如下指令手动刷新,( C指 COMPLETE
,完全刷新 )
arduino
begin
DBMS_mview.refresh('view_mate','C');
end;
3.2 创建自动刷新的物化视图
3.2.1 语句
3.3 创建不生成数据的物化视图
3.3.1 语句
3.4 创建增量刷新的物化视图
3.4.1 语句
3.4.2 特性测试
插入数据,由于创建时没有指定自动刷新,基表添加数据后不会更新内容
此时会在物化视图日志中新增一条内容:
手动刷新后,日志表清空