设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] oracle数据库物化视图的使用

[复制链接]

尚未签到

发表于 2016-8-3 16:49:34 | 显示全部楼层 |阅读模式
  物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图允许在本地维护远程数据的副本。物化视图是单向的,虽然可以更新物化视图的数据,但是一旦刷新后,更新的数据就没有了。高级复制是双向的。
  
1、创建物化视图
  创建自动更新的物化视图
  CREATE MATERIALIZED VIEW T_TEST_MV
  REFRESH FAST ON DEMAND WITH ROWID
  START WITH SYSDATE NEXT SYSDATE + 30/86400
  AS
  SELECT * FROM t_test;
  这样,T_TEST_MV会有一个job自动更新,时间间隔为30秒。
  On Demand的话,如果加了START WITH子句,在dba_jobs中有个刷新Job,具体Job ID可以查看dba_refresh、dba_refresh_children视图。如果不加START WITH则需要自己刷新Begin dbms_mview.refresh(list => 'T_TEST_MV', method => 'F');END; 。
  第二个参数表示刷新的方式:F-Fast,C-Complete,?-Force
  上面创建物化视图的模式为ON DEMAND,还有一种是ON COMMIT,ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工刷新,也可以通过JOB定时进行刷新。ON COMMIT指物化视图在对基表的DML操作提交的同时进行刷新。
  刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。
  
2、物化视图日志
  快速刷新需要先创建原表的物化视图日志,先创建一个表T_TEST,然后就可以创建它的物化视图日志。
  create materialized view log on T_TEST with rowid;
  这样就创建了一个物化视图日志了,通过下面的查询,可以看到日志是否已创建:
  Select * From all_mview_logs Where Master = 'T_TEST';
  通过下面的查询,可以看到日志的内容:
  SELECT * FROM mlog$_T_TEST;
  上面那个物化视图是通过with rowid指定为ROWID的,也可以指定PRIMARY KEY,则物化视图日志中会包含主键列。
  一个表建立一个物化视图日志,如果原表的数据作了更新,但是对应的物化视图没有刷新,那么物化视图日志里面就会有表更新的相关记录,一旦刷新了,会清除记录。物化视图日志可以对应多个物化视图的刷新,那么只有所有物化视图都刷新了,日志才会清空。
  下面作了个测试看在刷新过程中,物化视图日志是怎样起作用的,是怎样刷新多个视图的。
  创建表:
  create table t_test
  (f1 number,
  f2 number);
  创建日志
  create materialized view log on t_test with rowid;
  创建2个物化视图
  create materialized view t_test_mv refresh fast on demand with rowid as
  select * from t_test;
  create materialized view t_test_mv2 refresh fast on demand with rowid as select * from t_test;
  (如果原表增加了新的字段,物化视图是不能刷新过来的。)
  插入数据
  insert into t_test values (1,1);
  commit;
  查看这两个视图的情况
  SELECT mview_name,
  last_refresh_date,
  staleness
  FROM all_mviews
  WHERE mview_name IN ('T_TEST_MV', 'T_TEST_MV2');
  MVIEW_NAME LAST_REFRESH_DATE
 STALENESS
 
T_TEST_MV 2008-12-17 17:01:00 NEEDS_COMPILE
T_TEST_MV2 2008-12-17 17:01:02 NEEDS_COMPILE
  从状态字段可以看出这两个物化视图都需要刷新。
  查询物化视图日志
  select * from mlog$_t_test
  表中有一条记录,SNAPTIME$$的字段为4000-1-1,表示t_test_mv和t_test_mv2都没有刷新。DML类型为“insert”,是新值。
  SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
4000-1-1 I N FE
  SNAPTIME$$:刷新时间。
  DMLTYPE$$:DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。
  OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。
  CHANGE_VECTOR$$:被修改的是哪个或哪几个字段。
  刷新t_test_mv,
  sys.dbms_snapshot.refresh('t_test_mv');
  查看这两个视图的情况
  MVIEW_NAME LAST_REFRESH_DATE
 STALENESS
 
T_TEST_MV 2008-12-17 17:02:36 FRESH
T_TEST_MV2 2008-12-17 17:01:02 NEEDS_COMPILE
  T_TEST_MV状态为FRESH,表示已刷新过,而T_TEST_MV2状态为NEEDS_COMPILE,表示还需要刷新。
  查询物化视图日志
  SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
2008-12-17 17:02:36 I N FE
  表中记录仍然存在,只是SNAPTIME$$的字段变为刚刚刷新t_test_mv的时间,然后再刷新T_TEST_MV2,日志中的记录被清除。物化视图日志在刷新过程中就是这样记录了多个视图的刷新情况。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252398-1-1.html 上篇帖子: Oracle数据库的SQL操作脚本 下篇帖子: ORACLE游标概念讲解和使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表