Oracle (三) 物化视图

一、定义

视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。

物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。对一个物化视图查询的执行效率与查询一个表是一样的。

二、语法

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 特性测试

插入数据,由于创建时没有指定自动刷新,基表添加数据后不会更新内容

此时会在物化视图日志中新增一条内容:

手动刷新后,日志表清空

相关推荐
非优秀程序员4 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员4 小时前
第06章 浙江帮的内战|《互联网产品恩仇录》
后端
非优秀程序员4 小时前
第08章 马云的反击|《互联网产品恩仇录》
后端
非优秀程序员4 小时前
题记|《互联网产品恩仇录》
后端·程序员·创业
Gopher_HBo8 小时前
Go CPU 剖析的"地基":信号、CAS、写屏障、无锁环形缓冲
后端
panbook8 小时前
从0到1实现一个分布式时序数据库(二):写入成功之后,如何用 WAL 找回数据
后端
Swot9 小时前
上传一张 4MB 图片,我先后撞上了三层请求体限制
后端
IT_陈寒9 小时前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端
OLRainM9 小时前
实习复盘:大模型网关渠道质量评分实战(二)—— 报错了到底算谁的锅?流式归因与 Token 补账踩过的 8 个真坑
后端
梦想恒远9 小时前
Spring Boot + LangChain4j 统计 token 成本:ChatModelListener 实测与单价口径
spring boot·后端