ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 初涉物化视图一

初涉物化视图一

原创 Linux操作系统 作者:zofe2008 时间:2009-01-17 00:45:41 0 删除 编辑

 初涉物化视图

 

最近在做一个BI项目,BI项目,就一定会涉及到数据仓库。数据仓库和生产数据库一个很重要的区别就是:生产数据库存放的是当前的实时的数据,而数据仓库存放的是历史数据。这就会引发一个很重要的问题:如何保持生产数据库和数据仓库的同步问题。现实中有多种解决的办法,不过由于刚接触这方面的东西,目前只了解到有2种方法。一种是通过ETL工具创建映射和计划来定期的刷新数据,另一种办法就是物化视图。正在做的这个项目中,这两种方法都用到了(不知道还有没有用到别的方法)。

在项目中,我本身没有用过物化视图,不过在业余的时间里,学习了一下这方面的东西,这里做一个笔记以备以后查询。

 

刚接触物化视图这个概念的时候,存在以下三个问题:

1、  什么是物化视图?

2、  它有什么用?

3、  怎么操作它?

下面的内容,我将视图回答以上三个问题,重点在于如何操作物化视图。

1、什么是物化视图,以及它有什么用

物化视图是数据库中的一种存储数据的对象,和表一样,存储了数据。用于预先计算并保存表连接或者聚集等耗时较多的操作。这样,在执行查询的时候,就可以避开连接、聚集等耗时的操作,从而快速的得到结果。它可以查询表,视图甚至是其他物化视图中的数据。和视图不同的是,它存储了实实在在的数据,而视图只是存储了定义而已,所以,也是可以在物化视图上创建索引的。物化视图在很多方面,和索引很相似:使用它的主要目的是为了提高查询性能;物化视图对应用是透明的,增加或者删除物化视图不会影响应用程序中查询语句的正确性和有效性;物化视图会占用存储空间;当基表发生变化时,物化视图也应当刷新。通常情况下,物化视图被称为主表(在复制期间)或者明细表(在数据仓库中)。

 

对于数据仓库这样的数据库来说,由于生产系统中存储了大量的明细和实时的数据,因此,在数据仓库中使用物化视图是非常必要和重要的。

 

2、操作物化视图

创建物化视图的用户需要一下权限: CREATE MATERIALIZED VIEW, CREATE TABLE, CREATE VIEW, SELECT,如果需要在其他的模式下创建,需要在表上有CREATE ANY MATERIALIZED VIEW和SLECT权限。如果是要查询引用别的模式中的物化视图,需要有引用的表的GLOBAL QUERY REWRITE OR QUERY REWRITE权限。如果打算使用物化视图,还需要修改或者添加参数文件中QUERY_REWRITE_ENABLED选项,值为TRUE。

 

2.1、创建物化视图

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 ;


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

MV_NAME : 是物化视图的名称一般是XXX_MV形式的;

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

TABLESPACE  : 指定物化视图存放的表空间。

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会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。

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

 

这里需要特别注意的是,如果需要进行快速刷新,则需要创建物化视图日志。物化视图日志的详细内容见“物化视图日志”一节。

   为了练习,我创建了一张表:

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;

 

以上两条SQL语句,第一条,以ROWID创建表tax的物化视图日志;

第二条,基于ROWID创建物化视图,该物化视图的数据需要马上生成,采用根据用户需要而进行增量刷新的方式同步数据,开始刷新的时间为系统当期时间的第二天,每天刷新一次,并且不支持查询重写。

 

现在查询物化视图TAX_MV中的数据,和表TAX中的完全一致,因为我们采取了IMMEDIATE的生成数据方式。

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

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

注册时间:2009-01-17

  • 博文量
    24
  • 访问量
    42340