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

物化视图类型:
包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。
 
创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
 
创建方式(Build Methods):
包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。

查询重写(Query Rewrite):
包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
 
刷新(Refresh):
指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。

刷新的模式有两种:
ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。 ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。

刷新的方法有四种:
FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。

物化视图日志:
如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。物化视图日志表的名称为mlog$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,oracle会自动在物化视图日志名称后面加上数字作为序号。

物化视图维护操作:
1. 创建语句:create materialized view mv_name as select * from table_name    默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。
2. 创建ON COMMIT物化视图:create materialized view mv_name refresh force on commit as select * from table_name    备注:实际创建过程中,基表需要有主键约束,否则会报错(ORA-12014)
3.  创建定时刷新的物化视图:create materialized view mv_name refresh force on demand start with sysdate next sysdate+1 (指定物化视图每天刷新一次)
4.  指定刷新时间(比如每天晚上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')
5. 对于已经创建好的物化视图,可以修改其刷新方式,比如把物化视图mv_name的刷新方式修改为每天晚上10点刷新一次: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')  
6.  物化视图的删除:drop materialized view mv_name

实验操作流程:(同库或者异库迁移同步表)

流程介绍:该方法的实现原理是对于要迁移的表对象,需要有一个主键,用于mv的刷新,对于符合该要求的表,在源表上创建mv日志,再在目标数据库上创建结构一样的表,然后在目标表上采用prebuilt方式创建mv,第一次采用完全刷新,之后采用增量刷新,等真正要切换的时候,只需要刷新完增量的日志,删除mv,保留目标表即可。

说明:这里我用同库的两个用户代替异库操作, scott用户代表源库 , andy用户代表目标库。

1.在源库上创建表和mview log

SQL> create table andy_01 as select * from dba_objects ;
Table created.
SQL> select count(*) from andy_01;

COUNT(*)
----------
    88770
--为基表建立主键,防止ORA-12014 does not contain a primary key constraint
SQL> delete from andy_01 where object_id is null;
SQL> alter table andy_01 add constraint pk_andy_01 primary key(object_id);
SQL> create materialized view log on andy_01;
Materialized view log created.
--源库查询 生成 materialized view log 对象名
SQL> select object_name from user_objects where object_name like '%MLOG$%';
OBJECT_NAME
-----------------------------------------------------------------------------
I_MLOG$_ANDY_01
MLOG$_ANDY_01    -> materialized view log 对象名

2. 授权

-- 授权目标库用户有查询 源库 materialized view log 的权限
SQL> grant select on scott.MLOG$_ANDY_01 to andy;
Grant succeeded.
SQL> grant select on scott.andy_01 to andy;

Grant succeeded.

3.在目标数据库上创建与该表一样的表,并在该表上创建prebuilt mv

SQL> create table andy_01 as select * from scott.andy_01 where 1=2;       异库加上@dblink_name
Table created.
SQL> select count(*) from andy_01;
  COUNT(*)
----------
         0
-- sys用户为目标用户授权
SQL> GRANT CREATE MATERIALIZED VIEW TO andy;

Grant succeeded.
-- 目标库创建 materialized view 
SQL> create materialized view andy_01 on prebuilt table refresh fast as select * from scott.andy_01;
Materialized view created.
 
4.做完全刷新和增量刷新

SQL> exec dbms_mview.refresh('andy_01','Complete');
PL/SQL procedure successfully completed.
SQL>  select count(*) from andy_01;

COUNT(*)
----------
     88765
 
--此时模拟在做完全刷新过程中,源库的表又发生了变化
SQL> insert into andy_01(object_id,owner) values(666666,'test');

1 row created.
SQL>  commit;

Commit complete.
--再做增量刷新
SQL> select count(*) from andy_01;

COUNT(*)
----------
     88765     
SQL> exec dbms_mview.refresh('andy_01');
PL/SQL procedure successfully completed.
 
SQL> select count(1) from andy_01;

COUNT(1)
----------
     88766

5.停机切换,做最后一次刷新,然后删除源库的mview log和目标库的mview

SQL> exec dbms_mview.refresh('andy_01');
PL/SQL procedure successfully completed.

6. 迁移完毕,清除 materialized view 与 materialized view log

-- 清除 目标库 materialized view
SQL> drop materialized view andy_01;
Materialized view dropped. 
SQL> select count(*) from andy_01;
  COUNT(*)
----------
     88766
这里删除的mview(andy_01)是prebuilt mv,所以删除该mview,并不删除相应的表。
-- 清除源库 materialized view log
SQL>  drop materialized view log on  ANDY_01;

Materialized view log dropped.
 
SQL> select object_name from user_objects where object_name like '%MLOG$%';

no rows selected

物化视图基础概念、mview跨库迁移表的更多相关文章

  1. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  2. SQL Server 跨库复制表方法小笔记

    insert into tableA (column1,column2.....) SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=127. ...

  3. [转]数据库中间件 MyCAT源码分析——跨库两表Join

    1. 概述 2. 主流程 3. ShareJoin 3.1 JoinParser 3.2 ShareJoin.processSQL(...) 3.3 BatchSQLJob 3.4 ShareDBJo ...

  4. 统计分析: 跨库多表join

    mysql中如果多个库在一个实例上, 可以进行多表的跨库Join, 但是如果后期数据库分隔到不同的实例机器上,有查询问题 mysql的查询优化器没有其他商业数据库做的好, 用来CRUD还行, 但是做大 ...

  5. mysql跨库联表查询

    首先要了解database与instance区别,见<MySQL中的实例.数据库关系简介> 跨库分为同一个instance下的跨库和不同instance下的跨库. 一.同一个MySQL实例 ...

  6. C++面试基础概念之动态库篇

    编写DLL所学所思(1)——导出函数 编写DLL所学所思(2)——导出类 C++ DLL导出类 知识大全 C++类库开发详解

  7. Oracle跨库复制表结构

    1.首先建立远程连接 create public database link LINK_SJPSconnect to system identified by manager using '(DESC ...

  8. 跨库导表数据(sql)

    程序员用 列子: insert into "000".tbFreeReportselect ReportCode ,ReportName ,GroupNamefrom openda ...

  9. sql server 大数据跨服务器迁移表数据——使用链接服务器

    1.创建链接服务器(填写链接服务器.远程登录.使用密码) 2.188.188.1.177是远程的 select count(*) from [188.188.1.177].BigDataAnalysi ...

随机推荐

  1. hadoop修改主机名遇到的坑

    正确的修改方式 CentOS修改主机名(hostname) 需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到r ...

  2. C++常用强制类型转换

    1.static_cast 最常用的类型转换符,在正常状况下的类型转换,如把int转换成float,如: int i; float f; f=(float)i; 或者 f=static_cast(i) ...

  3. SERVICE_STATUS结构各成员解析

    在编写Windows服务的时候,需要调用API函数::SetServiceStatus()向服务控制管理器(SCM)提交更新当前服务的状态信息,其第2个参数为指向SERVICE_STATUS结构的指针 ...

  4. 跟着实例学习设计模式(6)-生成器模式builder(创建型)

    生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...

  5. 华为基于策略划分VLAN的配置方法及示例

     学过思科交换机的朋友,可能对基于策略划分VLAN的配置方法印象非常深,感觉确实比较复杂,先要配置VMPS以及VMPS数据库,但在华为交换机中,这种现象得到了彻底改变,因为它有了一种特殊的端口类型—— ...

  6. Windows下Nginx+Web.py+FastCGI服务搭建

    在搭建之前,有必要了解下什么是fastcgi,但鉴于我自己也不大了解,这里就不搬门弄斧了,请参考各种百科和官网资料. 1.资源下载 python下载地址:戳这里webpy下载地址:戳这里flup下载地 ...

  7. spring AOP(切面)

    AOP 基本概念cross  cutting concern横切性关注点:独立服务,遍布在系统处理流程之中 Aspect对横切关注点模块化 advice对横切关注点具体实现 pointcut定义adv ...

  8. EasyNVR RTSP摄像机HLS直播服务器中使用Onvif协议获取设备快照

    我们知道EasyNVR中可以获取快照信息,之前的文章也说明了EasyNVR是如何进行快照抓取的 这里我们使用另一种方法进行快照的抓取 流程 获取设备能力Capabilities 获取设备的能力,并且可 ...

  9. 九度OJ 1164:旋转矩阵 (矩阵运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3188 解决:1245 题目描述: 任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0.90.180. ...

  10. 《CSS权威指南(第三版)》---第四章 值和单位

    本章主要讲解的是一些属性声明用的值: CSS中的值主要有数字,百分数,颜色, 1.颜色: rgb(100%,100%,100%)  OR  rgb(255,255,255) OR #FF0000 WE ...