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

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

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

手动刷新后,日志表清空

相关推荐
余槐i3 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8263 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林4 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne5 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF5 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li6 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala6 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna6 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈7 小时前
因为太想讨好你,所以AI会骗你
后端
吴凡wudianmei7 小时前
每调一次模型都花钱?如何用工程手段把调用压到最少?
前端·后端·架构