物化视图 (Materialized View),在以前的Oracle版本中称为快照(Snapshot)。Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样在执行查询时,就可以避免进行这些耗时的操作,而从快速地得到结果。
物化视图有很多方面和索引很相似,使用物化视图的目的是为了提高查询性能,物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性,物化视图需要占用存储空间,当基表发生变化时,物化视图也应当刷新。物化视图可以分为以下三种类型:包含聚集的物化视图、只包含连接的物化视图和嵌套物化视图。
物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进
行快速刷新操作。对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。
一、先来看看怎么创建一个物化视图
create materialized view vi_emp refresh force on demand as select d.dname,e.ename,e.job,e.hiredate from scott.dept d,scott.emp e where d.deptno=e.deptno;
物化视图的刷新(refresh)的方法有四种:fast、complete、force和never,Oracle默认采用force方式,如上所示。
fast:刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
complete:刷新对整个物化视图进行完全的刷新。
force:刷新时会去判断是否可以进行快速刷新,如果可以则采用fast方式,否则采 用complete的方式。
never:指物化视图不进行任何刷新。
物化视图的类型有两种:on demand和on commit
on demand:顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(refresh),即更新物化视图,以保证和基表数据的一致性。
on commit:一旦基表有了commit,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
二、创建定时刷新的物化视图(每天晚上10点刷新):
reate materialized view vi_emp refresh force on demand start with to_date('03-02-2012 14:50:59', 'dd-mm-yyyy hh24:mi:ss') next to_date(concat(to_char(sysdate + 1, 'yyyy-MM-dd'), ' 22:00:00'), 'yyyy-MM-dd hh24:mi:ss') as select d.dname,e.ename,e.job,e.hiredate from scott.dept d,scott.emp e where d.deptno=e.deptno;
三、删除物化视图:
drop materialized view vi_emp;
四,物化视图案例(每15分钟刷新一次,1/1440 表示1分钟)
create materialized view MV_LOTATTRINFO refresh fast on demand start with to_date('15-09-2021 13:22:34', 'dd-mm-yyyy hh24:mi:ss') next sysdate + 15/1440 as select fromid, MAX (DECODE (name, 'Priority', VALUE, '')) AS Priority, MAX (DECODE (name, 'BatchId', VALUE, '')) AS BatchId, MAX (DECODE (name, 'BaseType', VALUE, '')) AS BaseType, MAX (DECODE (name, 'ProberGroup', VALUE, '')) AS ProberGroup, MAX (DECODE (name, 'WoNo', VALUE, '')) AS WoNo, MAX (DECODE (name, 'GroupId', VALUE, '')) AS GroupId, MAX(decode(name,'Spec',value,'')) as Spec, MAX(decode(name,'SorterEqp',value,'')) as SorterEqp, MAX(decode(name,'DYP',value,'')) as DYP, MAX(decode(name,'LotOwner',value,'')) as LotOwner, count(*) as CNT, MAX(decode(name,'EPI_STRUCTURE',value,'')) as EPI_STRUCTURE, MAX(decode(name,'MultStepQTimeStart',value,'')) as MultStepQTimeStart, MAX(decode(name,'QTimeStart',value,'')) as QTimeStart from mes_lot_attributes group by fromid;
转载地址:Oracle高级--物化视图(materialized view)_土豆牛肉拌面-CSDN博客_materialized