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

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


一、物化视图的类型:数据库

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

二、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')编码


三、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)设计

 

四、物化视图的刷新
刷新(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')日志

 

五、物化视图具备表同样的特征对象

因此能够像对表同样,咱们能够为它建立索引,建立方法和对表同样。

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

 

普通视图和物化视图的区别
普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一块儿的,
首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,
而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,若是表很大的话,会在临时表空间内作大量的操做。

普通视图的三个特征:
一、是简化设计,清晰编码的东西,他并非提升性能的,他的存在只会下降性能
(如一个视图7个表关联,另外一个视图8个表,程序员不知道,以为很方便,把两个视图关联再作一个视图,那就惨了),他的存在未了在设计上的方便性

二、其次,是安全,在受权给其余用户或者查看角度,多个表关联只容许查看,不容许修改,
单表也能够同WITH READ ONLY来控制,固然有些项目基于视图作面向对象的开发,即在视图上去作INSTAND OF触发器,就我我的而言是不站同的,虽然开发上方便,可是未必是好事。

三、从不一样的角度看不一样的维度,视图能够划分维度和权限,并使多个维度的综合,也就是你要什么就能够从不一样的角度看,而表是一个实体的而已,
通常维度较少(如:人员表和身份表关联,从人员表能够查看人员的维度统计,从身份看,能够看不一样种类的身份有那些人或者多少人),
其次另外一个如系统视图USER_TABLE、TAB、USER_OBJECTS这些视图,不一样的用户下看到的确定是不同的,看的是本身的东西。
物化视图呢,用于OLAP系统中,固然部分OLTP系统的小部分功能未了提升性能会借鉴一点点,由于表关联的开销很大,因此在开发中不少人就像把这个代价交给按期转存来完成,
ORACLE固然也提供了这个功能,就是将视图(或者一个大SQL)的信息转换为物理数据存储,而后提供不一样的策略:
定时刷仍是及时刷、增量刷仍是全局刷等等能够根据实际状况进行选择,总之你差的是表,不是视图。


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

而索引这个提及来就多了,能够说索引专门是一门课程,大概点来讲,索引通常有普通索引、位图索引、惟一性索引(还有全文索引啥的,通常不用),
其实仔细研究会发现不管是那一种索引都是B+树为基础,并起存放方式和表同样,是以段为单位,只是内部有树关系而已。

一、普通索引是根据B+树找到第一个(索引时有序的),而后以当前为基准,向后顺序找到不符合条件的健值为止。
二、位图是在叶子节点上根据位图种类对叶子节点的值进行01编码存放(如该字段有一、二、3三种值,就会在叶子节点上有三个位图,
每一个位图根据健值和ROWID顺序存放是否为一、是否为二、是否为3,因此在RBO下统计很快,CBO下通常会认为是普通索引)。

三、也是按照B+树找,只是找到就再也不作任何操做,由于是惟一的。由于B+查找是一个相似表的查询,并且获取到ROWID后仍是要回表查询的,因此这个过程的开销要和全表扫描计算那个结果更加快,ORACLE才会选择是走索引仍是走全表扫描,固然对于CBO和RBO选择的方式不同,具体又是不少,CBO要依赖于表的统计信息,RBO是依赖于尝试。

相关文章
相关标签/搜索