普通视图和物化视图区别,物化视图简单语法(转)
转自普通视图和物化视图的区别,物化视图简单语法
创建物化视图:
create materialized view MV_except_pattern_orders
as
select * from v_except_pattern_orders
删除物化视图:
drop materialized view MV_except_pattern_orders
更新物化视图:
call DBMS_MVIEW.REFRESH('MV_EXCEPT_PATTERN_ORDERS','C');
DBMS_MVIEW.REFRESH
('countries_mv,regions_mv,hr.employees_mv','cf');
This statement performs a complete refresh of the countries_mv materialized view, a fast refresh of the regions_mv materialized view, and a default refresh of the hr.employees materialized view.
上述sql让物化视图countries_mv执行了全局刷新,regions_mv执行了增量刷新,hr.employees_mv执行了默认刷新
创建自动更新的物化视图:
create materialized view MV_except_pattern_orders
refresh Complete on demand
start with to_date('2010-01-01 13:20:51','YYYY-MM-DD HH24:MI:SS') next sysdate+1/(24*60)
as
select * from v_except_pattern_orders
问题:普通视图和物化视图的区别
普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义 SQL去查询,而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。
普通视图的三个特征:
1、是
简化设计,清晰编码的东西,他并不是提高性能的,他的存在只会降低性能(如一个视图7个表关联,另一个视图8个表,程序员不知道,觉得很方便,把两个视图关联再做一个视图,那就惨了),他的存在未了在设计上的方便性
2、其次,是
安全,在授权给其他用户或者查看角度,多个表关联只允许查看,不允许修改,单表也可以同WITH READ ONLY来控制,当然有些项目基于视图做面向对象的开发,即在视图上去做INSTAND OF触发器,就我个人而言是不站同的,虽然开发上方便,但是未必是好事。
3、
从不同的角度看不同的维度,视图可以划分维度和权限,并使多个维度的综合,也就是你要什么就可以从不同的角度看,而表是一个实体的而已,一般维度较少(如:人员表和身份表关联,从人员表可以查看人员的维度统计,从身份看,可以看不同种类的身份有那些人或者多少人),其次另一个如系统视图USER_TABLE、TAB、 USER_OBJECTS这些视图,不同的用户下看到的肯定是不一样的,看的是自己的东西。
物化视图呢,用于OLAP系统中,当然部分 OLTP系统的小部分功能未了提高性能会借鉴一点点,因为表关联的开销很大,所以在开发中很多人就像把这个代价交给定期转存来完成,ORACLE当然也提供了这个功能,就是将视图(或者一个大SQL)的信息转换为物理数据存储,然后提供不同的策略:定时刷还是及时刷、增量刷还是全局刷等等可以根据实际情况进行选择,总之你差的是表,不是视图。