物化视图(物化视图和普通视图的区别是什么)
大家好,今天我将向大家分享有关物化视图和物化视图和普通视图的区别是什么的一些独特见解,希望能够为你们带来新的思考和启示。
物化视图和普通视图的区别是什么
普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。
普通视图的三个特征:
1、是简化设计,清晰编码的东西,他并不是提高性能的,他的存在只会降低性能(如一个视图7个表关联,另一个视图8个表,程序员不知道,觉得很方便,把两个视图关联再做一个视图,那就惨了),他的存在未了在设计上的方便性
2、其次,是安全,在授权给其他用户或者查看角度,多个表关联只允许查看,不允许修改,单表也可以同WITH READ ONLY来控制,当然有些项目基于视图做面向对象的开发,即在视图上去做INSTAND OF触发器,就我个人而言是不站同的,虽然开发上方便,但是未必是好事。
3、从不同的角度看不同的维度,视图可以划分维度和权限,并使多个维度的综合,也就是你要什么就可以从不同的角度看,而表是一个实体的而已,一般维度较少(如:人员表和身份表关联,从人员表可以查看人员的维度统计,从身份看,可以看不同种类的身份有那些人或者多少人),其次另一个如系统视图USER_TABLE、TAB、USER_OBJECTS这些视图,不同的用户下看到的肯定是不一样的,看的是自己的东西。
物化视图,用于OLAP系统中,当然部分OLTP系统的小部分功能未了提高性能会借鉴一点点,因为表关联的开销很大,所以在开发中很多人就像把这个代价交给定期转存来完成,ORACLE当然也提供了这个功能,就是将视图(或者一个大SQL)的信息转换为物理数据存储,然后提供不同的策略:定时刷还是及时刷、增量刷还是全局刷等等可以根据实际情况进行选择,总之你差的是表,不是视图。
物化视图和视图的最大区别
物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
1.创建方式(BuildMethods):包括BUILDIMMEDIATE和BUILDDEFERRED两种。BUILDIMMEDIATE是在创建物化视图的时候就生成数据,而BUILDDEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILDIMMEDIATE。
2.查询重写(QueryRewrite):包括ENABLEQUERYREWRITE和DISABLEQUERYREWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLEQUERYREWRITE。
3.物化视图刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ONDEMAND和ONCOMMIT。ONDEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ONCOMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。
刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCEONDEMAND。
4.在建立物化视图的时候可以指定ORDERBY语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入Oracle物化视图的定义中,而且对以后的刷新也无效。
物化视图与一般视图有何区别
物化视图是一种特殊的物理表,
“
物化
”(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
物化视图,需要再增加个参数即可。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!