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

一般的同步方式可以通过时间戳做全量和增量数据同步(存在原数据变化可能,数据不一致的情况),也可以通过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. vscode用yuml画类图

    vscode用yuml画类图 最近在找画类图的工具,发现vscode一款插件很好用,还支持markdown.vscode插件中直接搜索yuml安装即可. 文件后缀.yuml. 文件开头第一行这样写// ...

  2. app接口,如何保证是由app内部调用而非外部模拟post请求调用。

    在爬虫快手主播信息的时候,发现只要我改动一下参数,比如第一页 page=1的时候,需要爬下一页,把page改为2发现提示sign验证失败了 也就是说,快手在开发的时候考虑了有人抓包到接口后,通过修改参 ...

  3. 初探flow.js

    第一部分:前言 我们知道JS是弱类型语言,在声明变量时不论是什么类型的变量我们都用var即可,所以js是非常灵活的,但是同时问题就是弱类型语言有可能会出错,比如在调用函数时,且往往在运行起来时才可以检 ...

  4. Web测试注意事项

    参考文章:http://www.51testing.com/html/07/n-3723307.html 总结下遇到的web测试的时候需要注意的地方: 页面分辨率:  通常是计算机的默认分辨率,但是还 ...

  5. JDBC(5)-处理大数据

    大数据对象处理主要有CLOB(character large object) 和BLOB(binary large object) 两种类型的字段. 在CLOB中可以存储大字符对象,比如长篇小说:在B ...

  6. Google推荐的图片加载库Glide

    英文原文 Introduction to Glide, Image Loader Library for Android, recommended by Google 首发地址  http://jco ...

  7. jreble安装 in idea

    http://www.cnblogs.com/littlehb/archive/2013/04/19/3031045.html

  8. 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17

    (十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ...

  9. bat执行java程序 good

    start.bat set MY_HOME=%~dp0  set JMS_BINDING_PATH=%MY_HOME%..\binds set JAVA_HOME=C:\Program Files\J ...

  10. 问题集录--JS如何处理和解析Json数据

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...