ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Materialized Views 物化视图 -实战篇

Materialized Views 物化视图 -实战篇

原创 Linux操作系统 作者:jiuniang012 时间:2009-09-22 22:25:49 0 删除 编辑
Materialized Views 物化视图 -实战篇

对于了解了物化视图的基本概念后来看看物化视图相关的操作、属性以及限制。

1. 创建物化视图
这里引用了http://space.itpub.net/14969361/viewspace-541299的内容,并相应的补充了一些内容。

CREATE MATERIALIZED VIEW MV_NAME [ON PREBUILT TABLE]

[TABLESPACE TABLESPACE_NAME]
[BUILD IMMEDIATE | DEFERRED]
[REFRESH [FAST | COMPLETE | FORCE]           [ON DEMAND | COMMIT]         
 [START WITH DATE]           [NEXT DATE]          
[WITH PRIMARY KEY | ROWID]]
[ENABLE QUERY REWRITE | DISABLE QUERY REWRITE]
AS

SELECT CLAUSE

[ORDER BY XXX];

以上是创建物化视图的比较完整命令,其中的[ ]部分均是可选的。下面分别对它们进行说明。

MV_NAME : 是物化视图的名称一般是XXX_MV形式的,另外如果物化视图是基于用户定义的prebuild表,那么这个物化视图的名字必须完全匹配表名。

ON PREBUILT TABLE : 将已经存在的表注册为物化视图。同时还需要提供描述创建该表的查询的SELECT子句。对于这个语句,知道的并不多。

TABLESPACE  : 指定物化视图存放的表空间。除非是基于用户定义的prebuild表建立的物化视图,都需要占用存储空间,可以用DBMS_MVIEW.ESTIMATE_SIZE来预估所需的空间。如果占用的空间比较大,可以利用压缩特性来节省空间。

BUILD 子句 : 指定何时生成数据。IMMEDIATE指定在创建物化视图时就生成数据;DEFERRED指定在创建时并不生成数据,以后根据需要生成数据。默认为IMMEDIATE选项。

REFRESH 子句 : 指定当基表的数据发生变化时,物化视图何时以何种方式和基表进行同步。FAST指定增量刷新方式,也就是只刷新自上次刷新后被修改的数 据;COMPLETE 指定对整个物化视图进行完全刷新;FORCE是默认选项,指定在刷新数据时,先判断是否能够使用FAST方式进行刷新,如果可行,则采用FAST方式刷 新,如果不可行,则使用COMPLETE方式刷新。ON DEMAND指定物化视图在用户需要的时候进行刷新,可以手工刷新,通过使用DBMS_MVIEW.REFRESH等方式刷新,也可以通过JOB方式进行 定时刷新,可以到表USER_JOBS中查看JOB的信息;ON COMMIT指定物化视图在基表的DML操作提交的同时进行刷新。START WITH指定第一次刷新的时间;NEXT指定刷新的时间间隔。

WITH PRIMARY KEY: 指定生成主键物化视图,也就是物化视图是基于表的主键,而不是ROWID(对应于ROWID选项)。如果要使用WITH PRIMARYKEY选项,基表上应该定义了主键,否则只能使用ROWID选项。WITH PRIMARY是默认选项。RowID物化视图只有一个单一的主表,不能包括下面任何一项:Distinct 或者聚合函数;Group by,子句,连接和Set操作。

ENABLE/DISABLE QUERY REWIRTE : 指定是否支持查询重写,默认不支持。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避 免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。在创建物化视图之前,可以利用DBMS_MVIEW.EXPLAIN_MVIEW来校验可以实现什么类型的查询重写功能,也可以通过DBMS_MVIEW.TUNE_MVIEW来优化物化视图定义语句来实现查询重写功能。如果物化视图已经被创建了,可以通过DBMS_MVIEW.EXPLAIN_REWRITE验证是否可以实现查询重写功能,或为什么不能实现。如果指定的BUILD方式是DEFERRED,那么必须执行至少一次完全刷新才可以实现查询重写。

对于查询重写和快速刷新的限制将在物化视图提高篇中介绍。

SELECT 子句 : 从基表取数据的查询语句,和普通的查询语句没有区别。

ORDER BY子句:只有在初始创建物化视图时可用,并且在完全刷新和快速刷新时不可用。为了提高大物化视图的查询性能,指定ORDER BY子句提供数据初始化是在物理上集群排序。如果在物化视图上还建有索引,那么使用该索引访问数据时由于物理上的集群排序将减少硬盘I/O。

2. 创建物化视图日志

     物化视图日志就是一个表,记录了对物化视图的操作历史,可以通过ALL_MVIEW_LOGS来查看所有的物化视图日志。

     对于快速刷新来说物化视图日志是必须的(除了PCT 刷新),一般在定义的时候要指定ROWID子句。另外,对于aggregate的物化视图来说,必须包含在物化视图里被引用表的所有列和INCLUDING NEW VALUES和SEQUENCE子句。

     例如:

    CREATE MATERIALIZED VIEW LOG ON sales WITH ROWID
    (prod_id, cust_id, time_id, channel_id, promo_id, quantity_sold, amount_sold)
    INCLUDING NEW VALUES;

    一般来说都建议在定义物化视图日志时指定SEQUENCE子句,除非你确定将不执行混合的DML操作(在多个表上的INSERT, UPDATE, DELETE组合操作)。

实例:

由于比较懒还是引用http://space.itpub.net/14969361/viewspace-541299的例子吧:

CREATE TABLE tax

(tax_id NUMBER, region VARCHAR2(30), tax_date DATE, tax NUMBER,

PRIMARY KEY (tax_id));

插入了一下数据:

"839","天津","2008-3-1","12038.48"

"840","威海","2008-3-1","15310.32"

"841","温州","2008-3-1","459432.9"

"842","信阳","2008-5-1","1574.73"

"843","徐州","2008-4-1","401.54"

"844","烟台","2008-8-1","17869.17"

"845","盐城","2008-3-1","1156.73"

"846","义乌","2008-3-1","988.22"

 

下面我将先创建物化视图日志:

CREATE MATERIALIZED VIEW LOG ON tax

TABLESPACE users

WITH ROWID;

 

然后,我创建物化视图tax_mv:

CREATE MATERIALIZED VIEW tax_mv
TABLESPACE users
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
START WITH trunc(SYSDATE) + 1 NEXT trunc(SYSDATE) + 1
WITH ROWID
DISABLE QUERY REWRITE
AS
SELECT t.tax_id, t.region, t.tax_date, t.tax
FROM tax t;

现在,我们向表
TAX中,插入以下数据:

INSERT INTO tax VALUES(847,'营口',to_date('2008-3-1','yyyy-mm-dd'),219.48);

此时,查询表tax中的数据,自然是多了一条新数据,但是去查询tax_mv中的数据时,并没有新插入的数据,因为数据并没有同步到物化视图中,这得需要下次刷新数据的时候,才能同步过来。不过我们现在可以手工的来同步数据。

 

执行以下任一程序语句:

SQL Window:

BEGIN

dbms_mview.refresh('tax_mv','C');

END;

 

COMMAND Window:

EXECUTEdbms_mview.refresh('tax_mv','C');

 

第一个参数是物化视图名称,第二个参数指明刷新方式,C-COMPLETE, F-FAST,?-FORCE。

这就手工刷新了物化视图中的数据,去查找物化视图中的数据,已经和基表中的数据同步了。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9466564/viewspace-615366/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-02

  • 博文量
    126
  • 访问量
    245637