普通视图和物化视图的区别

2023-11-12

 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。

1、物化视图的类型:ON DEMAND、ON COMMIT
    二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。

2、ON DEMAND物化视图
    物化视图的创建本身是很复杂和需要优化参数设置的,特别是针对大型生产数据库系统而言。但Oracle允许以这种最简单的,类似于普通视图的方式来做,所以不可避免的会涉及到默认值问题。也就是说Oracle给物化视图的重要定义参数的默认值处理是我们需要特别注意的。
    物化视图的特点:
    (1) 物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到佐证;
    (2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;
    (3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证;
    创建语句:create materialized view mv_name as select * from table_name
    默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。

    物化视图的数据怎么随着基表而更新?
    Oracle提供了两种方式,手工刷新和自动刷新,默认为手工刷新。也就是说,通过我们手工的执行某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据一致性。这是最基本的刷新办法了。自动刷新,其实也就是Oracle会建立一个job,通过这个job来调用相同的存储过程或包,加以实现。
    
    ON DEMAND物化视图的特性及其和ON COMMIT物化视图的区别,即前者不刷新(手工或自动)就不更新物化视图,而后者不刷新也会更新物化视图,——只要基表发生了COMMIT。
    创建定时刷新的物化视图:create materialized view mv_name refresh force on demand start with sysdate
next sysdate+1 (指定物化视图每天刷新一次)
    上述创建的物化视图每天刷新,但是没有指定刷新时间,如果要指定刷新时间(比如每天晚上10:00定时刷新一次):create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')

3、ON COMMIT物化视图
    ON COMMIT物化视图的创建,和上面创建ON DEMAND的物化视图区别不大。因为ON DEMAND是默认的,所以ON COMMIT物化视图,需要再增加个参数即可。

    需要注意的是,无法在定义时仅指定ON COMMIT,还得附带个参数才行。
    创建ON COMMIT物化视图:create materialized view mv_name refresh force on commit as select * from table_name
    备注:实际创建过程中,基表需要有主键约束,否则会报错(ORA-12014)
4、物化视图的刷新
    刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。(如上所述)
    刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。
     对于已经创建好的物化视图,可以修改其刷新方式,比如把物化视图mv_name的刷新方式修改为每天晚上10点刷新一次:alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')
  
5、物化视图具有表一样的特征,所以可以像对表一样,我们可以为它创建索引,创建方法和对表一样。

6、物化视图的删除:
     虽然物化视图是和表一起管理的,但是在经常使用的PLSQL工具中,并不能用删除表的方式来删除(在表上右键选择‘drop’并不能删除物化视图),可以使用语句来实现:drop materialized view mv_name

 

 

普通视图和物化视图的区别
答曰:普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。
普通视图的三个特征:
1、是简化设计,清晰编码的东西,他并不是提高性能的,他的存在只会降低性能(如一个视图7个表关联,另一个视图8个表,程序员不知道,觉得很方便,把两个视图关联再做一个视图,那就惨了),他的存在未了在设计上的方便性
2、其次,是安全,在授权给其他用户或者查看角度,多个表关联只允许查看,不允许修改,单表也可以同WITH READ ONLY来控制,当然有些项目基于视图做面向对象的开发,即在视图上去做INSTAND OF触发器,就我个人而言是不站同的,虽然开发上方便,但是未必是好事。
3、从不同的角度看不同的维度,视图可以划分维度和权限,并使多个维度的综合,也就是你要什么就可以从不同的角度看,而表是一个实体的而已,一般维度较少(如:人员表和身份表关联,从人员表可以查看人员的维度统计,从身份看,可以看不同种类的身份有那些人或者多少人),其次另一个如系统视图USER_TABLE、TAB、USER_OBJECTS这些视图,不同的用户下看到的肯定是不一样的,看的是自己的东西。

物化视图呢,用于OLAP系统中,当然部分OLTP系统的小部分功能未了提高性能会借鉴一点点,因为表关联的开销很大,所以在开发中很多人就像把这个代价交给定期转存来完成,ORACLE当然也提供了这个功能,就是将视图(或者一个大SQL)的信息转换为物理数据存储,然后提供不同的策略:定时刷还是及时刷、增量刷还是全局刷等等可以根据实际情况进行选择,总之你差的是表,不是视图。


关于在刷新和索引上的区别
答曰:他们两个没有联系吧,刷新我不清楚你是否指的是物化视图的刷新,因为刷新的概念很泛,你说到这里我就理解为物化视图的刷新了,上面也已经说了,这是一种策略和方法,其实它是通过对视图关联表上创建相应的LOG,根据日志信息的SQL同步到物化视图中的,一般来说:定时的一般是全局刷,及时的一般是局部刷。

而索引这个说起来就多了,可以说索引专门是一门课程,大概点来说,索引一般有普通索引、位图索引、唯一性索引(还有全文索引啥的,一般不用),其实仔细研究会发现无论是那一种索引都是B+树为基础,并起存放方式和表一样,是以段为单位,只是内部有树关系而已。
1、普通索引是根据B+树找到第一个(索引时有序的),然后以当前为基准,向后顺序找到不符合条件的健值为止。
2、位图是在叶子节点上根据位图种类对叶子节点的值进行01编码存放(如该字段有1、2、3三种值,就会在叶子节点上有三个位图,每个位图根据健值和ROWID顺序存放是否为1、是否为2、是否为3,所以在RBO下统计很快,CBO下一般会认为是普通索引)。
3、也是按照B+树找,只是找到就不再做任何操作,因为是唯一的。

因为B+查找是一个类似表的查询,而且获取到ROWID后还是要回表查询的,所以这个过程的开销要和全表扫描计算那个结果更加快,ORACLE才会选择是走索引还是走全表扫描,当然对于CBO和RBO选择的方式不一样,具体又是很多,CBO要依赖于表的统计信息,RBO是依赖于尝试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

普通视图和物化视图的区别 的相关文章

随机推荐

  • 基于java+springboot+mybatis+vue+elementui的高校学习用品购物平台

    项目介绍 近年来 随着信息技术的高速发展和现代网络技术的完善 电子商务日益受到人们的重视 发展成为一种新兴商务模式 高校学习用品购物平台是电子商务的一项重要内容 高校学习用品购物平台的出现 使得学生购物变得更轻松 快捷 方便 满足了广大师生
  • Linux快速安装MySQL

    文章目录 Linux上安装MySQL 1 安装MySQL 1 上传MySQL安装包以及MySQL驱动jar包 2 解压MySQL安装包 3 卸载系统自带的mariadb 4 安装MySQL依赖 5 安装mysql client 6 安装my
  • vulnhub靶场-SOCIAL NETWORK

    1 靶机信息 靶机名称 BOREDHACKERBLOG SOCIAL NETWORK 靶机难度 中等 虚拟机环境 此靶机推荐使用Virtualbox搭建 目标 获取到root 权限 靶机地址 BoredHackerBlog Social N
  • Dockerfile(5) - CMD 指令详解

    CMD 指定容器默认执行的命令 exec 形式 推荐 CMD executable param1 param2 CMD 可执行命令 参数1 参数2 作为ENTRYPOINT的默认参数 CMD param1 param2 shell CMD
  • JetBrains IDEA插件推荐

    主题 VSCode Dark vscode的蓝黑配色 长时间写代码不伤眼 毕竟是vsocde多年的累积 配合dark黑色主题看着非常舒服 SequenceDiagram 自动生成类的调用时序图 更直观的看到类的内部调用关系 Maven He
  • Vue3 入口文件createApp函数

    在2 x中 main js是vue项目的入口文件 引入构造函数Vue 然后new Vue传入配置项生成vm实例 如下 import Vue from vue import App from App vue import router fro
  • 【DASCTF2023】Misc mp3

    浅浅记录一道比较绕的misc题 有一道思路比较类似的题目 DASCTF7月赋能赛 Misc wp zysgmzb 博客园 题目 附件是一个mp3 查看了音频波形图之后发现没有什么收获 binwalk分析 发现是有一张图片 不过我用binwa
  • leetcode88.合并两个有序数组

    88 合并两个有序数组 题目叙述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同
  • Echars之雷达图的实现

    骑士李四记录 1 参数构造思路 参数 legend的data radar的indicator series的data 格式 series的data中的value要和radar的indicator的name一一对应 构造思路 构造series
  • Unity程序化地形教程 第二期 噪声图的完善和更多细节添加

    Unity程序化地形教程 第二期 噪声图的完善和更多细节添加 前言 完整的程序化地形教程在我的主页相关专栏中 目前正在持续更新 可以添加收藏 方便日后查找 零 学完本期能够实现的效果 书接上期 学完之后相比上期能够有更多的细节和优化 话不多
  • Win10+RTX2080深度学习环境搭建:tensorflow、mxnet、pytorch、caffe

    文章目录 准备工作 设置conda国内镜像源 conda 深度学习环境 tensorflow mxnet pytorch安装 tensorflow mxnet pytorch Caffe安装 配置文件修改 编译时常见错误 运行时错误 参考
  • Unity 刮刮卡拖动UI,随便擦除,转着圈擦,360度

  • 使用 acl 库编写高效的 C++ redis 客户端应用

    一 概述 可以直接略过此段 redis 最近做为 nosql 数据服务应用越来越广泛 其相对于 memcached 的最大优点是提供了更加丰富的数据结构 所以应用场景就更为广泛 redis 的出现可谓是广大网络应用开发者的福音 同时有大量的
  • C++游戏日志(六)A*寻路法,简单,详细注释

    一个游戏中最常见的寻路算法 每个点有四个属性 开始将起点存入开表 一 循环每次找出开表中F值 G H 最小的点存入闭表 并删除开表中的点 二 以此点为基础进行四方向寻路 也可以写八方向 三 五个判断一次进行 是否越界 是否碰墙 是否走到终点
  • 不要再使用 @Builder 注解了!

    一 前言 曾经 我在 千万不要再随便使用 lombok 的 Builder 了 一文中提到 Builder 注解的其中一个大坑会导致默认值失效 最近阅读了 Oh Stop using Builder 发现 Builder 的问题还不止一个
  • 1.CPU体系架构-RISC指令集和CISC指令集

    最近一直比较疑惑 RISC指令集以及CISC指令集区别在哪些方面呢 趁机也就补充了相关资料 进行了一些总结 目前CISC 复杂指令集 的代表为X86 CISC RISC 精简指令集 的代表为ARM MIPS RISC 还有新兴的RISCV指
  • 北航计算机录取最低分,2019年北京航空航天大学考研复试最低分数要求_北航各科目分数线-聚英北航考研网...

    据悉 北京航空航天大学2019年硕士研究生招生复试资格基本线及复试规定已发布 聚英北京航空航天大学考研网小编为大家整理如下 根据2019年我校硕士研究生招生初试成绩统计结果和各学科专业拟招生计划 经学校研究生招生工作领导小组讨论决定 北京航
  • git commit的时候卡在 “Locking pre-commit directory“上的解决办法

    删除 cache 的pre commit 文件夹即可 参考链接 https github com pre commit pre commit issues 675
  • k8s集群部署二进制(二)

    目录 7 1 前置环境和安装Docker 7 2 部署Master2 Node 192 168 31 74 7 3 部署Nginx负载均衡器 7 4 修改所有Worker Node连接LB VIP 七 高可用架构 扩容多Master架构 K
  • 普通视图和物化视图的区别

    物化视图是一种特殊的物理表 物化 Materialized 视图是相对普通视图而言的 普通视图是虚拟表 应用的局限性大 任何对视图的查询 Oracle都实际上转换为视图SQL语句的查询 这样对整体查询性能的提高 并没有实质上的好处 1 物化