oracle物化视图

物化视图定义

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

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

物化视图的优点是查询速度快,因为数据已经存在,查询物化视图就等同于查询一张表的数据。

物化视图的缺点就是占用空间,因为数据是真实存储的,而不像普通视图只是一条查询语句。

物化视图创建语法:

CREATE MATERIALIZED VIEW view_name 
[BUILD IMMEDIATE | BUILD DEFERRED]
refresh [FAST|COMPLETE|FORCE] 
[ON [COMMIT|DEMAND] | START WITH (start_time) NEXT (next_time)]

AS
subquery

BUILD IMMEDIATE:是在创建物化视图的时候就生成数据。(默认)

BUILD DEFERRED:在创建时不生成数据,以后根据需要再生产数据。

刷新(refresh):指在基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。

refresh关键字后面可以指定的刷新方式有三种:FAST、COMPLETE、FORCE(默认),FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。

刷新的模式有两种:ON COMMIT和ON DEMAND(默认),ON COMMIT指基表发生COMMIT操作时自动刷新;ON DEMAND指需要手动刷新物化视图。

下面的实例都是基于oracle中scott用户自带的emp表和dept表数据进行操作:

类型一:手动刷新的物化视图

创建物化视图:

create materialized view MV_EMP
refresh force on demand
as
select e.ename,d.dname from emp e
left join dept d on e.deptno = d.deptno;

以上创建的含义就是创建一个名称为mv_emp的物化视图,视图数据的采用手动刷新的模式(on demand),自动选择增量或全量更新(refresh force)。

创建完成后,可以发现,在PL/SQL中,Tables和Materialized views中,都会显示刚才创建的物化视图对象。

查询物化视图数据:

往emp表中插入一条数据(15条记录):

查询物化视图数据(14条记录):

可以看到物化视图结果集中只有14条记录,最新插入的记录并没有被查询出来,这时因为刚才创建的物化视图是手动刷新模块(on demand),所以需要手动执行物化视图数据更新语句,进行数据更新操作。

手动刷新物化视图记录:

begin
  dbms_mview.refresh('mv_emp');
end;

刷新后,再查询物化视图(15条记录):

这次数据跟emp表记录数一致了。

类型二:自动刷新的物化视图

create materialized view mv_emp1
refresh force on commit
as
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;

以上创建的含义就是创建一个名称为mv_emp1的物化视图,视图数据的采用自动刷新的模式(on commit),自动选择增量或全量更新(refresh force)。

这里需要注意下,emp表和dept表关联的写法改了,以为如果使用left join关键字,会提示“无法为实体化视图设置 ON COMMIT 刷新属性”。

视图创建完毕,对视图进行查询(15条记录):

对emp表插入数据:

再查询物化视图:

发现物化视图的数据自动刷新了,跟emp表数据保持一致。

手动刷新和自动刷新两种刷新方式,根据实际情况进行选择,对数据实时性要求不高的,可以选择手动刷新,比如要做个每日报表,统计每天的数据情况,可以使用手动刷新(每天凌晨1点);对数据实时性要求高的,选择自动刷新。

类型三:创建时不生成数据的物化视图

create materialized view mv_emp2
build deferred
refresh force on commit
as
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;

类型一和类型二,视图创建完毕,视图就自动加载了基表的数据,如果要想在视图创建完毕后,先不生成数据,在需要的时候再生成数据,则可以使用build deferred关键字进行设置。

查询生成的视图:

可以看到视图中没有任何记录。

如果想让视图中加载数据,则需要手动执行下数据更新的方法:

begin
  dbms_mview.refresh('mv_emp2');
end;

执行完毕,再次查询,视图中就加载了最新的数据:

此时因为视图是提交时更新,所以在emp表数据变化时时,视图的数据会随之更新。

类型四:创建增量更新的物化视图

注意:创建增量刷新的物化视图,必须:

1.创建物化视图中涉及表的物化视图日志,记录基表发生了什么变化,用这些记录去更新物化视图。

2.在查询语句中,必须包含所有表的rowid(以rowid方式建立物化视图日志)

--为基表创建 物化视图日志
create materialized view log on emp with rowid;
create materialized view log on dept with rowid;

执行完毕后,在Tables中可以看到创建的日志表:

创建增量更新的物化视图,查询语句中必须加上基表的rowid

create materialized view mv_emp3
refresh fast on demand
as
select e.rowid erowid,d.rowid drowid, e.ename,d.dname 
from emp e, dept d where e.deptno = d.deptno;

以上创建的含义就是创建一个名称为mv_emp2的物化视图,视图数据的采用手动刷新的模式(on demand),增量更新(refresh fast)。

 

查询视图数据集:

对emp表删除一条数据,查看物化视图日志表中数据的信息:

手动进行刷新操作:

begin
  dbms_mview.refresh('mv_emp3');
end;

物化视图的数据才会被更新,同步物化视图日志的数据被被清除,也就是说物化视图日志中的数据是待处理的数据,当物化视图更新后,物化视图日志中的数据就会被删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/284041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】STM32学习笔记-输入捕获测频率和占空比(18)

00. 目录 文章目录 00. 目录01. 预留02. 输入捕获测频率接线图03. 输入捕获测频率示例04. 输入捕获测频率和占空比接线图05. 输入捕获测频率和占空比示例06. 示例程序下载07. 附录 01. 预留 02. 输入捕获测频率接线图 03. 输入捕获测频率示例 pwm.h #ifndef __PWM_H #define…

从入门到精通UNet: 让你快速掌握图像分割算法

文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构五、训练模型5.1 模型训练流程5.2 模型评估指标5.…

【JS逆向】逆向案例之 ----- 安某客滑块

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 安某客滑块小结 1. 初步分析 总共分为两步, 获取滑块图片信息检查滑块移动是否正确 整体框架如下: 1.1 getinfoTp 获取图片信息…

Plantuml之JSON数据语法介绍(二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Nx市工业数据洞察:Flask、MySQL、Echarts的可视化之旅

Nx市工业数据洞察:Flask、MySQL、Echarts的可视化之旅 背景数据集来源技术选型功能介绍创新点总结 背景 随着工业化的不断发展,Nx市工业数据的收集和分析变得愈发重要。本博客将介绍如何利用Flask、MySQL和Echarts等技术,从统计局获取的数据…

【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤,为先膨胀,后腐蚀。这两步操作能将看起来很接近的元素,如区域内部的空洞或外部孤立的点连接成一体,区域的外观和面积也不会有明显的改变。通俗地说,就是类似于“填…

echarts 折线图根据x轴时间渲染不同颜色的折线

footIm 如上图所示一条折线多种颜色 后端数据返回"data": [ { “dateTime”: “2023-10-11 00:02:10”, “pos”: 6, “curr”: 104.6 }, { “dateTime”: “2023-10-11 00:02:39”, “pos”: 7, “curr”: 104.6 }, …] 我们拿到后端返回的res.data传递给…

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 ,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…

Java EE Servlet之Cookie 和 Session

文章目录 1. Cookie 和 Session1.1 Cookie1.2 理解会话机制 (Session)1.2.1 核心方法 2. 用户登录2.1 准备工作2.2 登录页面2.3 写一个 Servlet 处理上述登录请求2.4 实现登录后的主页 3. 总结 1. Cookie 和 Session 1.1 Cookie cookie 是 http 请求 header 中的一个属性 浏…

【微服务】2.创建多个服务器

vmware有克隆功能直接拷贝以及设置好的虚拟机 如果要自己设置IP地址,修改/etc/sysconfig/network-scripts/ 编辑ifcfg-ens33需改ip地址 #开机加载网络配置启动网络服务 ONBOOT"yes" #分配ip的协议 none static :不自动分配,手动设置ip / dhcp…

Iterator(迭代器) 和 list

Iterator(迭代器) 和 list 文章目录 一、Iterator(迭代器)二、list 提示:以下是本篇文章正文内容,下面案例可供参考 一、Iterator(迭代器) 对 collection 进行迭代的迭代器。迭代器…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1)VGG模型简化版2)GoogLeNet简化版——MiniGoogLeNet 3. 模型训练及保存 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交…

Avalonia学习(十六)-Mapsui

今天开始继续Avalonia练习。 本节&#xff1a;Mapsui 1.引入 Mapsui.Avalonia 2.项目引入 前台代码 <Window xmlns"https://github.com/avaloniaui"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:vm"using:MapsuiAvalonia.Vi…

个人任务和项目管理软件tududi的安装

现在已经是 2024 年了&#xff0c;祝大家新年快乐&#xff0c;万事如意。 什么是 tu|du|di ? tu|du|di是一个使用 Sinatra 构建的任务和项目管理 Web 应用程序。它允许用户有效地管理他们的任务和项目&#xff0c;将它们分类到不同的区域&#xff0c;并跟踪截止日期。tu|du|d…

Linux驱动学习—ioctl接口

1、unlock_ioctl和ioctl有什么区别&#xff1f; kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针&#xff0c;取而代之的是unlocked_ioctl 。ioctl是老的内核版本中的驱动API&#xff0c;unlock_ioctl是当下常用的驱动API。unlocked_ioctl 实际上取…

服务器监控软件夜莺部署(一)

文章目录 一、夜莺介绍1. 简介2. 相关网站 二、夜莺部署1. 部署架构2. Docker启动3. 配置数据源4. 内置仪表盘效果5. 时序指标效果 一、夜莺介绍 1. 简介 夜莺监控系统是一款专业的服务器监控软件&#xff0c;它可以帮助用户实时监测服务器的CPU、内存、磁盘利用率等。 夜莺监…

0101包冲突导致安装docker失败-docker-云原生

文章目录 1 前言2 报错3 解决结语 1 前言 最近在学习k8s&#xff0c;前置条件就是要安装指定版本的docker&#xff0c;命令如下 yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.62 报错 file /usr/libexec/docker/cli-plugins/docker-buildx fr…

动态内存管理篇

为什么要动态内存分配&#xff1f; 之前&#xff0c;我们向内存申请空间&#xff0c;有两种方式&#xff0c;一种是定义变量&#xff0c;一种是建立数组&#xff1b;但是&#xff0c;这两种方式都有缺陷&#xff0c;创建的空间大小是固定的&#xff0c;在程序的运行过程中&…

听GPT 讲Rust源代码--library/alloc(2)

File: rust/library/alloc/src/vec/mod.rs 在Rust源代码中&#xff0c;rust/library/alloc/src/vec/mod.rs这个文件是Rust标准库中的Vec类型的实现文件。Vec是一个动态大小的数组类型&#xff0c;在内存中以连续的方式存储其元素。 具体来说&#xff0c;mod.rs文件中定义了以下…