ORACLE 物化视图
原文链接:https://blog.csdn.net/weixin_42011858/article/details/110704663
1. 物化视图的类型:
ON DEMAND、ON COMMIT 二者的区别在于刷新方法的不同
1 | ON DEMAND:仅在该物化视图“需要”被刷新了,才进行刷新 (REFRESH),即更新物化视图,以保证和基表数据的一致性; |
2. ON DEMAND物化视图
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。
创建定时刷新的物化视图:
1 | create materialized view mv_name refresh force on demand start with sysdate next sysdate+1 |
(指定物化视图每天刷新一次) 上述创建的物化视图每天刷新,但是没有指定刷新时间,如果要指定刷新时间(比如每天晚上 10:00 定时刷新一次):
1 | 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 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 点刷新一次:
1 | 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
。