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