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

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

[复制链接]

尚未签到

发表于 2018-9-14 06:53:28 | 显示全部楼层 |阅读模式
  物化视图存储基于远程表的数据,也可称为快照,是远程数据的本地副本,或者用来生成基于数据表求和的汇总表
  通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)
  对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的
  如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取
  物化视图把他的物理结构存储在自己的段中,该段可以被索引和分区
  查询不必完全匹配用来创建物化视图的 SQL 语句,优化程序可以动态重写一个与原定义相近的查询
  ⑴ 使用物化视图前的几个配置步骤
  使用一个物化视图,用户只需在基表上拥有权限即可
  ① 确定那些语句要创建物化视图
  ② 决定是否要保持视图与基表数据同步
  如果不同步,可选择如下三种刷新方式:
  COMPLETE:刷新启动时,先 truncate 物化视图,再从基表重新物化数据
  FAST:只刷新基表上次刷新后改变的数据,使用视图的日志数据或ROWID完成
  FORCE:默认的方式,先使用FAST,不行就使用COMPLETE方式
  ③ 设置 init.ora 的参数
  JOB_QUEUE_PROCESSES,必须设置大于 1
  QUERY_REWRITE_ENABLED,设置为 TRUE 时,允许动态重写查询
  QUERY_REWRITE_INTEGRITY,确定访问物化视图时数据一致性要遵守的程度
  OPTIMIZER_MODE,必须设置成 CBO 的某种方式
  ⑵ 创建物化视图
  案例:
  hr@ORCL> create materialized view mv_t
  2   tablespace users
  3   build immediate
  4   refresh complete --如果需要进行快速刷新,则需要建立实体化视图日志
  5   enable query rewrite
  6   as
  7   select * from t;
  Materialized view created.
  注释:
  ① refresh [fast|complete|force] 视图刷新的方式
  fast: 增量刷新。假设前一次刷新的时间为t1,那么使用fast模式刷新物化视图时,只向视图中添加t1到当前时间段内
  基表变化过的数据,为了记录这种变化,建立增量刷新物化视图还需要一个物化视图日志表
  create materialized view log on (主表名);
  complete:全部刷新。相当于重新执行一次创建视图的查询语句
  force: 这是默认的数据刷新方式。当可以使用fast模式时,数据刷新将采用fast方式;否则使用complete方式
  ② MV 数据刷新的时间
  on demand:在用户需要刷新的时候刷新,这里就要求用户自己动手去刷新数据了(也可以使用job定时刷新)
  on commit:当主表中有数据提交的时候,立即刷新 MV 中的数据
  start ……:从指定的时间开始,每隔一段时间(由 next 指定)就刷新一次
  ③ Build immediate 一共有三个选项
  Build immediate:建立物化视图,并使用当前命令执行的数据马上填充视图数据
  Build deferred:只建立物化视图,在第一次刷新之间不填充数据
  No prebuilt table,使用事先已存在的,已含有视图定义中有现有数据的表,而不是建立一个新结构来保存数据
  ④ 刷新物化视图
  自动刷新:
  (1) 使用 commit 选项
  手工刷新:
  (2) 使用 dbms_mview 安排自动刷新时间
  exec dbms_mview.refresh('MV_T')
  ⑤ 禁用物化视图
  - 修改 init.ora 参数的 query_rewrite_enabled 参数设置成 flase,重启实例

  - 使用>
  - 使用>  - 使用 norewrite 提示
  其实,如果在创建MV的时候没有指定enable query rewrite的选项时,也是不会走物化视图查询的
  ⑥ 删除物化视图
  drop materialized view mv_t;
  ⑶ 物化视图的类型
  先看两种刷新方法
  ON DEMAND:手动
  ON COMMIT:自动
  不论如何,这二者的本质,都在于保证MV与基表数据的一致性
  物化视图可以分为以下三种类型:
  ① 包含聚集的物化视图
  ② 只包含连接的物化视图
  ③ 嵌套物化视图
  这三种类型在增量刷新(fast)时的限制条件差别很大,而对于其它方面则相去无几
  创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
  Ⅰ 创建方式(Build Methods)
  包括 BUILD IMMEDIATE 和 BUILD DEFERRED 两种
  BUILD IMMEDIATE是在创建物化视图的时候就生成数据,默认为 BUILD IMMEDIATE
  而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据
  Ⅱ 查询重写(Query Rewrite)
  包括ENABLE QUERY REWRITE 和 DISABLE QUERY REWRITE两种
  分别指出创建的物化视图是否支持查询重写
  查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果
  如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据
  默认为 DISABLE QUERY REWRITE
  但是,我们必须要指定ENABLE QUERY REWIRTE,"县官不如现管"
  如果为DISABLE QUERY REWRITE,即使SESSION为ENABLE QUERY REWRITE也是不行的
  在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存
  不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效
  ⑷ ON DEMAND 物化视图
  物化视图的特点:
  ① 物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到佐证
  ② 物化视图也是一种段(segment),所以其有自己的物理存储属性
  ③ 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证
  默认情况下,如果没指定刷新方法和刷新模式,则 Oracle 默认为 FORCE 和 DEMAND:
  create materialized view mv_name as select * from table_name;
  物化视图的数据怎么随着基表而更新?
  Oracle提供了两种方式,手工刷新和自动刷新,默认为手工刷新
  也就是说,通过我们手工的执行某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据一致性
  自动刷新,其实也就是Oracle会建立一个job,通过这个job来调用相同的存储过程或包,加以实现
  ON DEMAND 物化视图的特性及其和ON COMMIT物化视图的区别
  即前者不刷新(手工或自动)就不更新物化视图,而后者不刷新也会更新物化视图,——只要基表发生了COMMIT
  创建定时刷新的物化视图(比如每天晚上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 物化视图
  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点刷新一次:

  >  to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');
  ㈦ 物化视图日志
  如果需要进行快速刷新,则需要建立物化视图日志
  物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的
  可以指明 ON PREBUILD TABLE 语句将物化视图建立在一个已经存在的表上
  这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表
  这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或stale_tolerated
  ㈧ 物化视图分区
  基于分区的物化视图可以支持分区变化跟踪(PCT)
  具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作
  对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 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.iyunv.com/thread-581453-1-1.html 上篇帖子: oracle数据库日期时间参数大全(一) 下篇帖子: Oracle 双监听器的配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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