`
fyd222
  • 浏览: 104617 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ORACLE物化视图 - 循序渐进MView(一) 什么是MView

 
阅读更多

 

http://www.dbabeta.com/2009/mview_step_by_step_01.html

 



前言

MView的两大应用方向

本系列文章以实例的方式一步步的说是什么是MView、MView的结构、MView的基本工作过程,以及MView的管理方法。


几个术语的对应

基表
指的是英文里面的Master Table和Master Materialized View,并不只是只一个表,而是创建MView的时候所需要用到的n个表或者是相关的上一级的MView。
MView
就是Materialized View了,物化视图。
源数据库端
Master Site和Master Materialized View Site,指的是基表所在的数据库
MView端
Materialized View Site,MView所在的数据库

 


什么是MView


MView的基本概念

MView中文名称为物化视图(Materialized View),相对于不同的视图来说,MView的不同之处在于MView的结果会保存在一个普通的数据表中,在对MView进行查询的时候不再会对创建MView的基表进行查询,而是直接查询MView对应的结果表,然后通过定期的刷新机制来更新MView表中的数据。


一个简单的例子

-- 创建一个测试用的表T
USER@orcl> create table t (a int, b varchar2(50), constraint pk_tprimary key(a));
Table created.
 
-- 创建对应的MV名为MVT
USER@orcl> create materialized view mvt as select * from t;
Materialized view created.
 
-- 现在往表里面插入一些个数据
USER@orcl> insert into t select rownum, object_name fromall_objects;
11449 rows created.
 
USER@orcl> commit;
Commit complete.
 
-- 现在我们看一下数据的情况
USER@orcl> select count(*) from t;
  COUNT(*)
----------
     11449
 
-- mvt还是没有数据的
USER@orcl> select count(*) from mvt;
  COUNT(*)
----------
         0
 
-- 下面对mview做一次刷新看看
USER@orcl> exec dbms_mview.refresh('mvt');
PL/SQL procedure successfully completed.
 
-- 现在能看到mv里面已经有数据了
USER@orcl> select count(*) from mvt;
 
  COUNT(*)
----------
     11449
 
-- 然后我们在看一下表T和MVT的结构可以发现他们两个是一样的
USER@orcl> desc t;
 Name                 Null?    Type
 -------------------- -------- -------------
 A                    NOT NULL NUMBER(38)
 B                             VARCHAR2(50)
 
USER@orcl> desc mvt;
 Name                 Null?    Type
 -------------------- -------- -------------
 A                    NOT NULL NUMBER(38)
 B                             VARCHAR2(50)


MView的作用

从上面的例子可以看到我们利用MV创建了一个现有数据表的一个复制,同时通过刷新的方式将两个数据表的数据进行了同步。这个就是我们在复制中利用MView的最主要的用法,所不同的是在实际应用的环境中表T和MView MVT并不是在同一个机器上,而是分散在两个以上的机器上,同时基表也可能不止一个,可能存在多个。

下面列举了MView在实际中的主要作用:

  • 减轻网络负担:通过MV将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担。
  • 搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数据的目的。
  • 复制数据子集:MV可以进行行级/列级的筛选,这样可以复制需要的那一部分数据。
  • 支持离线计算:MV不需要专用的数据库连接,用户可以按照自己的需求来复制所需要的那一部分数据。


MView的刷新

下面接着说说MView刷新这个事。

MView里面的数据是不会和基表保持实时的同步的,它只是基表在某时时间点(刷新的时间点)的一个一致性的数据的镜像,因此,要保持MView尽可能的和基表同步的话就需要我们定期的对MView进行刷新。


MView刷新的分类

Oracle支持三种种方式的刷新:完全刷新和快速刷新以及强制刷新。

完全刷新(complete refresh)

对一个MView进行全部刷新的时候差不多是将MView重建了,在进行MView全部刷新的时候会现将MView中现有的数据删除(版本在10G或以上)或者TRUNCATE(版本低于9i),然后在根据创建MView时候的查询生成数据插入到MView中。

对于多层的MView来说,当master MView全部刷新之后对应的下一级的MView也需要全部刷新,否则将会收到ORA-12034的错误。

快速刷新(fast refresh)

快速刷新是一种比完全刷新快的多的刷新方式,快速刷新只刷新自上次刷新以来修改的数据,因为快速刷新所要操作的数据量少,使用这种方法能大大的节省带宽.

快速刷新要求在基表上面有MView Log,接着上面给出的例子,我们来给MVT做一个快速刷新。

-- 现在表T上面创建MView Log
-- 如果没有建立MView Log的话要进行快速刷新的话会报错的,大家可以试试
USER@orcl> create materialized view log on t;
Materialized view log created.
 
-- 先看一下我们要修改的数据
USER@orcl> select * from t where a=936;
         A B
---------- --------------------------------------------------
       936 v_$fast_start_servers
 
USER@orcl> select * from mvt where a=936;
         A B
---------- --------------------------------------------------
       936 v_$fast_start_servers
 
-- 接着对表T数据进行一些修改
USER@orcl> update t set b=upper(b) where a=936;
1 row updated.
 
-- 现在T里面的这条数据变成了这样
USER@orcl> commit;
Commit complete.
 
USER@orcl> select * from t where a=936;
         A B
---------- --------------------------------------------------
       936 V_$FAST_START_SERVERS
 
-- 接下来就是进行快速刷新了
USER@orcl> exec dbms_mview.refresh('mvt', 'F');
PL/SQL procedure successfully completed.
 
-- 现在看MVT里面的结果
USER@orcl> select * from mvt where a=936;
         A B
---------- --------------------------------------------------
       936 V_$FAST_START_SERVERS

快速刷新最大的问题在于如果保证能进行快速刷新,这是对与复杂的查询来说是有些挑战的问题,以后会慢慢的探讨。

强制刷新(force refresh)

当进行强制刷新的时候系统会首先尝试进行快速刷新,如果快速刷新无法进行的时候系统将会进行完全刷新。其实就是一个快速刷新和完全刷新的结合体。


指定刷新方式

既然有那么多种的刷新方式那我们怎么指定他们呢?

在Oracle中有两种方法来制定所用的刷新方式,第一种在上面我们已经看过了,就是在执行刷新MView语句的时候制定刷新方式,比如说

exec dbms_mview.refresh('mvt', 'F');

用来指定对MView mvt进行快速刷新,将其中的”F”改成”C”就是指定对mvt进行完全刷新了。

exec dbms_mview.refresh('mvt', 'C');

另外一种方法是直接执行

exec dbms_mview.refresh('mvt');

就是不指定刷新的参数,这个时候MView的刷新方式将是根据创建时候由REFRESH语句指定的刷新方法来进行刷新了,REFRESH语句一共有下面几种使用方法

[refresh [fast | complete | force]
  ......
  ]
  • FAST: 采用增量刷新,只刷新自上次刷新以后进行的修改
  • COMPLETE: 对整个实体化视图进行完全的刷新
  • FORCE(默认): Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用Fast方式,否则采用Complete的方式,Force选项是默认选项


什么时候刷新

现在怎么刷新的问题解决了,接下来就是考虑我们什么时候进行刷新了。

我们从上面已经知道我们需要定期的对MView进行刷新以保证基表和MView的数据同步,这个定期的方法就是使用job,同样我们有两种方法来创建刷新MView的job。

使用DBMS_JOB包来创建

 

-- 提交一个JOB用来刷新MView
USER@orcl> variable job1 number;
USER@orcl> execdbms_job.submit(:job1,'dbms_mview.refresh(''"user"."mvt"'');',sysdate,'sysdate+1/24');
PL/SQL procedure successfully completed.
 
USER@orcl> commit;
Commit complete.
 
-- 查看一下结果
USER@orcl> select JOB,NEXT_DATE,NEXT_SEC,INTERVAL,WHAT fromuser_jobs;
       JOB NEXT_DATE           NEXT_SEC                 INTERVAL                       WHAT
---------- ------------------- ------------------------ ------------------------------ ----------------------------------------
        23 2009-01-13 13:52:14 13:52:14                 sysdate+1/24                   dbms_mview.refresh('"user"."mvt"');

使用这种方法相对下面的方法来说不同之处在于这种方法可以自己指定刷新的语句,这样灵活性相对高一些。

在创建MView的时候指定REFRESH语句

没错,还是REFRESH语句,这个语句的用法还是挺多的,下面列出这个语句的其他用法:

[refresh ......
         [start with date]
         [next date]
  ......
  ]
  • START WITH: 第一次刷新时间
  • NEXT: 刷新时间间隔

说明:指定上面两个选项的任意一个都将会在系统中产生一个新的JOB,用来对所建立的MV进行刷新,这个JOB可以从DBA_JOBS查到,同时删除MV之后该JOB也会被删除。下面我们看一个例子:

-- 创建一个MView,并指定刷新时间为sysdate和刷新间隔为一个小时
USER@orcl> create materialized view mvt2 refresh start with sysdatenext sysdate+1/24 as select * from t;
Materialized view created.
 
-- 现在我们看一下job
-- 请注意这里的WHAT那一栏中MView刷新的代码是不带刷新方式的,也就是说按照创建时候的刷新方式进行刷新
USER@orcl> select JOB,NEXT_DATE,NEXT_SEC,INTERVAL,WHAT fromuser_jobs;
JOB NEXT_DATE           NEXT_SEC  INTERVAL      WHAT
--- ------------------- --------- ------------- ----------------------------------------
 21 2009-01-13 13:20:20 13:20:20  sysdate+1/24 dbms_refresh.refresh('"USER"."MVT2"');

另外这里所说的JOB定时刷新只是针对于单个MView来说的,而对于存在多个MView要刷新的时候我们就要开始考虑刷新组了,这个部分以后再慢慢说明。


MView的基本构成

说了这么多的MView的例子,那么MView的结构到底是怎么样的呢?我们先看一副Oracle给出的MView的结构图:

MView架构图(来自Oracle Advance Replication)

现在我们只对一些当前接触到的相关的对象进行说明,其他的部分将在后面的文章中陆续说明:

必要组成部分
  • 基表(MASTER TABLE):这里说的基表不一定只有一个表,也有可能是一个复杂的查询,涉及很多的表,也可能是一个MView。
  • 隐藏的MView对象:对象类型为Materialized View的一个对象,用来维护MView的创建信息。
  • MView表:MView所对应的数据表,这个表也就是一个普通的表,不同的就是这个表是和一个MView相关联的表。
  • 基表的INDEX
  • MView的INDEX:对以用PK建立的MView将会有一个与基表结果一样名字类似的索引,对以使用ROWID建立的MView将有一个以I_SNAP$_materialized_view_name格式命名的建立在ROWID列上的INDEX。当然你也可以根据需要自己再创建一些INDEX。
对于需要快速刷新的物化视图
  • MView LOG:要使MView能够被快速刷新的话必须在基表上面创建MView Log,创建MView Log的语法为CREATE MATERIALIZED VIEW LOG ON master_name,MView Log表为Oracle默认以MLOG$_master_name的命名格式建立。
  • 维护MLOG$_的内部触发器:在基表上面的所有DML操作都有一个在基表上的内部触发器记录到MLOG$_master_name中,这个触发器在USER_TRIGGERS是看不到的,不过能够用USER_INTERNAL_TRIGGERS看到。

下面用一个例子来看一下这些个对象

-- 创建一个基表
SQL> CREATE TABLE TTT1(A INT PRIMARY KEY, B INT);
Table created.
 
-- 以TTT1为基表创建一个可更新的MView
SQL> CREATE SNAPSHOT MV_TTT1 FOR UPDATE AS SELECT * FROM TTT1;
Materialized view created.
 
-- 创建MView Log
SQL> CREATE MATERIALIZED VIEW LOG ON TTT1;
Materialized view log created.
 
-- 检查MView的对象
SQL> SELECT OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHEREOBJECT_NAME LIKE '%TTT1%';
OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
TTT1                           TABLE
MV_TTT1                        MATERIALIZED VIEW
MV_TTT1                        TABLE
MLOG$_TTT1                     TABLE
USLOG$_MV_TTT1                 TABLE
 
-- 查看MView相关的INDEX
SQL> SELECT INDEX_NAME,TABLE_NAME FROM USER_INDEXES WHERE TABLE_NAMELIKE '%TTT1%';
 
INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------
PK_TTT11                       MV_TTT1
PK_TTT1                        TTT1
 
-- 查看内部触发器
SQL> SELECT * FROM USER_INTERNAL_TRIGGERS WHERE TABLE_NAME LIKE'%TTT1%';
TABLE_NAME                     INTERNAL_TRIGGER_TY
------------------------------ -------------------
MV_TTT1                        UPDATABLE MVIEW LOG
TTT1                           MVIEW LOG
本文采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议发布,转载请保留此信息 
作者:马齿苋 | 链接:http://www.dbabeta.com/2009/mview_step_by_step_01.html
分享到:
评论

相关推荐

    oracle物化视图_循序渐进学习笔记

    在本篇循序渐进的学习笔记中,我们将深入探讨物化视图的概念、用途、刷新机制及其相关问题。 首先,我们需要了解几个关键术语。基表是创建物化视图时引用的原始数据表或视图,而物化视图(MView)则是基于这些基表...

    Oracle物化视图应用详解

    Oracle物化视图是一种数据库对象,它存储了查询结果,以提供快速的数据访问,特别适合于需要频繁查询但计算过程复杂或涉及大量数据连接的场景。物化视图的使用可以显著提高查询性能,因为它避免了每次查询时的计算...

    Oracle数据库中物化视图的原理剖析

    Oracle数据库中的物化视图(Materialized View,简称MV)是一种强大的优化工具,它通过预先计算并存储查询结果,提供了一种快速访问复杂查询数据的方式。这种技术在数据仓库环境中尤其有用,因为数据仓库通常涉及...

    oracle 物化视图详解(内含例子)

    物化视图是Oracle数据库中一种特殊的数据对象,它保存的是基于一个或多个表(称为基表)的查询结果集,并且这些结果集是物理上存在的。与普通的视图不同,普通视图只是一种虚拟表,在执行查询时才动态地计算结果,而...

    ORACLE使用物化视图和查询重写功能

    ### ORACLE使用物化视图和查询重写功能 #### 一、概述 在Oracle数据库中,物化视图和查询重写功能是提高查询效率和简化数据仓库管理的重要工具。物化视图是一种预计算的数据集合,它可以存储查询的结果集,而查询...

    Oracle物化视图介绍

    在Oracle数据库中,物化视图(Materialized View, MV)是一种预计算并存储的查询结果,它能够显著提高复杂查询的性能。通常情况下,复杂的查询涉及到多个表的连接操作或者大量的聚合计算,这些操作可能会消耗大量的...

    oracle物化视图资料

    Oracle物化视图是一种特殊类型的数据库对象,其核心功能在于预先计算并存储基于一个或多个表的查询结果,以此来加速后续的查询操作。与普通视图不同,普通视图在每次查询时都需要重新执行定义它的SELECT语句,而物化...

    oracle物化视图

    【Oracle物化视图】是Oracle数据库中一种特殊的数据对象,它存储了查询结果集的物理副本,可以提供对远程数据的快速访问和一致性保证。物化视图的主要优点在于,它可以减少对远程数据源的访问,提高数据的本地可用性...

    oracle的物化视图

    Oracle的物化视图是一种数据库对象,它存储了查询结果,从而提供了一种高效的数据访问方式。物化视图的主要目标是提升查询性能,尤其是在处理复杂查询、连接操作或聚合计算时。它们在数据仓库环境中尤其有用,因为...

    Oracle中管理物化视图变得更加容易

    在Oracle数据库中,物化视图(Materialized View, MV)是一种重要的性能优化工具,尤其在数据仓库和决策支持系统中。物化视图预先计算并存储了一个查询的结果,允许快速访问而不是每次需要时重新执行复杂的查询。在...

    Oracle数据库中物化视图的原理剖析.pdf

    Oracle数据库中的物化视图(Materialized View, MV)是一种数据对象,它预先计算并存储了一个查询的结果,以便后续查询可以更快地访问这些数据,而无需每次请求时都执行原始查询。物化视图在数据仓库和数据分析场景...

    一个物化视图的简单例子

    本文将通过一个具体的Oracle数据库环境下的物化视图创建与管理的例子,深入解析物化视图的工作原理及其在实际应用中的优势。 ### 物化视图的基本概念 物化视图是数据库系统中一种特殊类型的表,它存储的是基于源表...

    使用物化视图和exp实现生产库的逻辑实时备份

    1. **物化视图**:物化视图是Oracle数据库中一种特殊类型的表,它存储着一个查询的结果集。物化视图可以被定期或实时地刷新,从而保证数据与源表保持一致。通过这种方式,可以在备份库中快速获得与生产库中表数据...

    OCM考试实验笔记之一_物化视图.pdf

    6. 为了管理物化视图的刷新,可以使用`DBMS_MVIEW.REFRESH`过程,如`EXEC DBMS_MVIEW.REFRESH('MV1')`或`EXEC DBMS_MVIEW.REFRESH('MV1', 'C')`,其中`'C'`参数表示完成刷新。 7. ITPUX技术网提供了更多关于Oracle ...

    oracle数据快照

    综上所述,Oracle 数据快照(通过物化视图日志实现)是一种非常实用的技术,它不仅能够帮助我们高效地管理和查询数据,还能在一定程度上降低资源消耗,提升系统的整体性能。对于那些需要频繁进行数据处理和分析的...

    mview:分布式系统的 CRDT 视图物化库

    MView - 物化视图库 MView 是一个分布式数据类型库。 它使用数据馈送并生成物作为 javascript 对象。 状态保存在内存中,但可以通过转储/加载 api 持久化。 API 概览 var mview = require ( 'mview' ) API规范: ...

    mview-src-0.3.2.tar.gz

    【标题】"mview-src-0.3.2.tar.gz" 指的是一个源代码压缩包,版本为0.3.2,主要用于查看三维图形。这个软件工具可能是一个轻量级的应用,允许用户在Linux操作系统环境下交互式地查看和操作3D模型。 【描述】"一个...

    Oracle数据仓库实体化视图的研究与应用

    ### Oracle数据仓库实体化视图的研究与应用 #### 摘要 本文深入探讨了Oracle数据仓库中的实体化视图(Materialized View)及其在实际应用中的重要性。通过研究,我们发现实体化视图是一种有效管理概要数据的方法,...

Global site tag (gtag.js) - Google Analytics