物化视图

来源:互联网 发布:软件随想录读后感 编辑:程序博客网 时间:2024/06/06 12:54

一、概述

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

物化视图(Materialized View)在9i以前的版本叫做快照(SNAPSHOT),从9i开始改名叫做物化视图。它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL 语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。

物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。物化视图可以查询表,视图和其它的物化视图。

二、创建(生成数据)方式

Build Immediate 和Build Deferred两种。Build Immediate 是在创建物化视图的时候就生成数据,而Build Deferred则在创建时不生成数据,以后根据需要再生成数据。默认为Build Immediate 。

如果此时没有生成数据,以后可以采取:EXEC DBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。

三、刷新类型

刷新的方法有四种:Fast 、Complete 、Force和Never。

Complete 刷新对整个物化视图进行完全的刷新,相当于重新生成物化视图,此时即时增量刷新可用也全量刷新。

如果选择Force方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用Complete 的方式。

Never指物化视图不进行任何刷新。默认值是Force On Demand。

四、刷新模式

manual

  • 刷新指定物化视图(MVs):
    DBMS_MVIEW.REFRESH
    (‘CUST_SALES’,parallelism=>10);
  • 刷新一个到多个基表的物化视图:
    DBMS_MVIEW.REFRESH_DEPENDENT(‘SALES’);
  • 刷新所有的物化视图:
    DBMS_MVIEW.REFRESH_ALL_MVIEWS;

automated

  • On demand:在需要刷新时进行刷新(人工判断)
  • On commit:在基表上有提交操作时,进行更新
  • Start with:指定首次刷新的时间(一般指定的是当前时间,不过也可以在创建物化视图时不生成数据,则可以考虑在指定的时间刷新,从而生成数据)
  • Next:刷新的周期时间

五、关于日志

创建物化视图时默认指定物化视图中存在主键,如果不指定,那么创建的物化视图日志文件的基表必须存在主键,否则会报错

创建物化视图日志时,指定了记录更新的原则即with 后面的primary 或者rowid 或者object id等等,后面,默认是以primary key为记录更新,在物化视图内也是以此为更新的原则,日志和视图要保持一致,否则会报错(例如:

1、如果日志内使用的是primary key 则在创建物化视图时指定rowid来更新,则会报ORA-12032: 不能使用 "TEST" 上实体化视图日志中的 rowid 列;2、如过日志内使用的是rowid 则在创建物化视图时指定primary或者默认指定,则会报ORA-23415: "GIS"."LZWMV" 的实体化视图日志不记录主键

)。如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为RowID或Primary Key类型的。还可以选择是否包括Sequence、Including New Values以及指定列的列表。

可以指明On PreBuild Table语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数Query_Rewrite_integerity必须设置为 trusted或者stale_tolerated。

六、关于表空间

直接在创建物化视图时指定日志存放的表空间和物化视图的表空间。

例子:

create materialized view MV_TEST tablespace test—-表空间名称

七、查询重写

Enable Query Rewrite和Disable Query Rewrite两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为Disable Query Rewrite。

在创建查询重写时,基表中必须有主键约束,视图里是无法创建主键的,不过其继承了基表的主键约束。

例子:

Create materialized view MV_TEST
Refresh fast —-前提是必须创建基表日志,可以忽略该项
Enable query rewrite —-前提是基表上必须存在主键约束
As
Select * from TEST; —-物化视图数据生成

八、删除

删除物化视图有两种顺序,一是先删除物化视图再删除日志;二是先删除日志再删除物化视图。 如果原数据表只被一个物化视图引用,那么可以采用先删除日志,再删除物化视图,这样删除的速度较快。

  • drop materialized view log on test_table;
  • drop materialized view mv_test_table;

如果日志上建立了多个物化视图,那么致删除物化视图即可,因为删除日志后,其他引用该日志的物化视图将无法刷新。

九、实例

例一: 使用自动增量刷新的物化视图的写法

创建物化视图日志,必须创建日志

Create materialized view log on TEST WITH ROWID,SEQUENCE (C1,C2,C3) INCLUDING NEW VALUES —-TEST为表名
—-注:(TEST为表名或者视图名,关于视图上建立物化视图,见基于视图的物化视图

—-创建物化视图语句:

Create materialized view MV_TEST

—-MVTEST为物化视图名

Build immediate

—-创建时生成数据对应的是build deferred

Refresh fast

—-增量刷新

On commit

—-在基表有更新时提交,这里该句对视图无效

With rowid

—-这里创建基于rowid的物化视图,对应的是 primary key

As

Select * from TEST;

—-生成物化视图数据语句

例二:使用指定FORCE刷新的物化视图的写法

create materialized view MV_DOP_TEST

TABLESPACE ifsapp_DATA –保存表空间

BUILD DEFERRED –延迟刷新不立即刷新,此建立初始视图一般没数据

refresh force –如果可以快速刷新则进行快速刷新,否则完全刷新

with rowid –根据rowid刷新(默认是主键)

On demand –按照指定方式刷新

start with to_date(‘2008-12-11 13:20:51’,’YYYY-MM-DD

HH24:MI:SS’) next sysdate+1/48

as

select dsso.dop_id,

soo.work_center_no,

soo.operation_description

from SHOP_ORDER_OPERATION SOO,

DOP_SUPPLY_SHOP_ORD DSSO

where soo.order_no=dsso.order_no

and soo.release_no=dsso.release_no

and soo.sequence_no=dsso.sequence_no

0 0