CREATE MATERIALIZED VIEW MV_NAME [ON PREBUILT TABLE]
[TABLESPACE TABLESPACE_NAME]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 taxTABLESPACE users
WITH ROWID;
然后,我创建物化视图tax_mv:
CREATE MATERIALIZED VIEW tax_mvINSERT 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/ ,如需转载,请注明出处,否则将追究法律责任。