现实工作中会有多个数据源同步到一个数据库完成数据分析的场景,这些数据可以不是实时同步的,我们一般通过定时任务抽取数据到统计分析库给应用使用。

一般的同步方式可以通过时间戳做全量和增量数据同步(存在原数据变化可能,数据不一致的情况),也可以通过dblink做数据实时查询(较损耗线上数据库性能),一般最好的方式是通过建立物化视图,然后通过schedual job完成定时数据同步,这里就记录下物化视图的使用。

一、物化视图简介

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。

1、物化视图分类

ON DEMAND:该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;

ON COMMIT:一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致;

默认情况创建物化视图不指定类型,则是按需刷新(on demand)

2、物化视图

二、物化视图使用

1、物化视图创建

物化视图的数据来源于基表,而刷新的起始点记录于物化视图日志,所以创建物化视图授权必须有基表——>物化视图日志(基于基表)——>物化视图

物化视图创建示例:

在dbtest下创建物化视图T,其中基表是scott用户下的dept表
(1)授权dbtest用户可以查询scott.dept
grant select on scott.dept to dbtest;
(2)在dbtest用户下创建表T (若创建物化视图加on prebuilt table)
create table t as select * from scott.dept where 1=2;
(3)在scott用户下创建物化视图日志,在dbtest下创建物化视图T
创建物化视图日志:
conn scott/tiger;
create materialized view log on dept;
grant select on MLOG$_DEPT to dbtest;
创建物化视图:
conn dbtest/dbtest;
create materialized view T
on prebuilt table
refresh fast on demand
as
select deptno,dname,loc,ACOLUMN from scott.dept; ##可以通过在 view T后加上BUILD IMMEDIATE参数立刻刷新物化视图,得到数据

REFRESH 子句可以包含如下部分:
   [refresh [fast|complete|force]
   [on demand | commit]
   [start with date] [next date]
   [with {primary key|rowid}]]

2、物化视图刷新

当基表有更新后(DML),如果不是on commit类型,物化视图需要刷新后数据才能保持和基表一致,刷新方式有全量刷新(COMPLETE)、快速刷新(增量FAST)、强制刷新(FORCE)、不刷新(NEVER)

FAST:增量快速刷新

exec dbms_mview.refresh('表名', 'F')  

exec dbms_mview.refresh('dbtest.t','F'); 

COMPLETE:全量刷新

exec dbms_mview.refresh('表名', 'C')   ;

exec dbms_mview.refresh('dbtest.t','C'); 

FORCE:刷新时判断否可以快速刷新,如果能快速刷新则执行fast刷新,如果不能则执行complete刷新

NEVER:不刷新

3、物化视图删除

drop MATERIALIZED VIEW  mview_name;

4、物化视图日志删除

物化视图日志是mlog$_basetablename命名格式

DROP MATERIALIZED VIEW LOG  on base_table_name;
MLOG$_DEPT 

 DEPTNO           主键列
SNAPTIME$$ 用于表示刷新时间
DMLTYPE$$ 用于表示dml操作类型,i表示insert,d表示delete,u表示update
OLD_NEW$$ 用于表示这个值是新值还是旧值。n(ew)表示新值(一般为delete操作),o(ld)表示旧值(一般为Insert操作),u表示update操作。
CHANGE_VECTOR$$ 表示修改矢量,用来表示被修改的是哪个或哪几个字段
XID$$ 如果with后面跟了primary key,则物化视图日志中会包含主键列。
如果with后面跟了rowid,则物化视图日志中会包含: m_row$$:用来存储发生变化的记录的rowid。
如果with后面跟了object id,则物化视图日志中会包含:sys_nc_oid$:用来记录每个变化对象的对象id。
如果with后面跟了sequence,则物化视图日子中会包含:sequence$$:给每个操作一个sequence号,从而保证刷新时按照顺序进行刷新。
如果with后面跟了一个或多个column名称,则物化视图日志中会包含这些列。 当基本表发生dml操作时,会记录到物化视图日志中,这时指定的时间4000年1月1日0时0分0秒(物化视图未被刷新)。
如果物化视图日志供多个物化视图使用,则一个物化视图刷新后会将它刷新的记录的时间更新为它刷新的时间。
只有建立快速刷新的物化视图才能使用物化视图日志,如果只建立一个物化视图,则物化视图刷新完会将物化视图日志清除掉

--当创建物化视图日志使用primary key时,oracle创建临时表 RUPD$_基础表

5、查看物化视图

set line 200;
set pagesize 20000;
col owner for a15;
col mview_name for a30;
col query for a60; select owner,mview_name,refresh_method,last_refresh_date,compile_state from dba_mviews;

#如果要看具体语句,可以通过query字段查看

三、附录

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。

Oracle物化视图详解的更多相关文章

  1. calcite物化视图详解

    概述 物化视图和视图类似,反映的是某个查询的结果,但是和视图仅保存SQL定义不同,物化视图本身会存储数据,因此是物化了的视图. 当用户查询的时候,原先创建的物化视图会注册到优化器中,用户的查询命中物化 ...

  2. (转)oracle视图详解

    Oracle视图详解   一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的.视图只有逻辑定义.每次使用的时候,只是重新执 ...

  3. Oracle权限管理详解

    Oracle权限管理详解 转载--CzmMiao的博客生活 Oracle 权限 权限允许用户访问属于其它用户的对象或执行程序,ORACLE系统提供三种权限:Object 对象级.System 系统级. ...

  4. Oracle建立全文索引详解

    Oracle建立全文索引详解1.全文检索和普通检索的区别 不使用Oracle text功能,当然也有很多方法可以在Oracle数据库中搜索文本,比如INSTR函数和LIKE操作: SELECT *FR ...

  5. Oracle cursor_sharing 参数 详解

    一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...

  6. ORACLE数据库备份与恢复详解

    ORACLE数据库备份与恢复详解 学习过程中的总结,有兴趣不妨看看,如果有不对的地方,高手不要留情!! Oracle的备份与恢复有三种标准的模式,大致分为两 大类,备份恢复(物理上的)以及导入导出(逻 ...

  7. Oracle执行计划详解

    Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介:   ...

  8. oracle表分区详解

    原文来自:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html oracle表分区详解 从以下几个方面来整理关于分区表的概念及 ...

  9. Oracle 物化视图 说明

    一.    物化视图概述 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. 物化视图可 ...

随机推荐

  1. Windows USB 编程

    GUID #include <initguid.h> // For DEFINE_GUID // Device Interface GUID.DEFINE_GUID(GUID_DEVINT ...

  2. (转)linux内存源码分析 - 内存回收(lru链表)

    原文:http://www.cnblogs.com/tolimit/p/5447448.html 概述 对于整个内存回收来说,lru链表是关键中的关键,实际上整个内存回收,做的事情就是处理lru链表的 ...

  3. (转)MySQL Proxy使用

    转自: http://www.cnblogs.com/itech/archive/2011/09/22/2185365.html http://koda.iteye.com/blog/788862 h ...

  4. Intel GPA 抓取3d模型

    原文链接在这里 http://dev.cra0kalo.com/?p=213 背景信息 Intel的GPA本身是一款图形分析软件,并没有设计从3D程序里抓取模型资源的功能,但这里作者是通过hook G ...

  5. java代码行数统计工具类

    package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...

  6. js&&jQuery实现省市区三级联动

    代码参考了:https://codepen.io/anon/pen/WzyNQB;根据自己的需要修改了一下,挂个出处 1.前端页面代码 <html> <head> <me ...

  7. BDD框架之Cucumber研究

    BDD框架之Cucumber研究 引用链接:http://kongqingyun123.blog.163.com/blog/static/6377283520134158437813/ Cucumbe ...

  8. aspose words做插入压缩后图片到Word文档中

    最近用aspose words做导出Word的功能,发现图片的导出有点难受,一开始是这样写的 Document doc = new Document("D:\\Template.docx&q ...

  9. servlet开发(二)之servlet的线程安全问题

    之所以考虑线程安全问题,是因为引入了多线程.多线程指的是这个程序(一个进程)运行时产生了不止一个线程.如果不考虑多线程的话,程序执行只有一条路径,就像人在敲代码的时候只能敲代码,不能戴上耳机听歌.引入 ...

  10. What is the relation of theme and it's derived theme.

    You know, a theme can derive from other theme in two ways: xx.xxx implicit way and parent="xxx& ...