CREATE MATERIALIZED VIEW

说明

该命令用于创建一个新的物化视图。

语法

create_materialized_view ::=

参数

mview_name

物化视图名字,必须是合法的OSCAR标识符。

如果给出带模式的名称SchemaName.MViewName,那么该物化视图使用指定模式(相应定义中的主表如果不含模式名,则默认是物化视图指定的模式)。否则使用该用户的默认模式。并且在某一模式中,物化视图名称必须唯一。

同一模式下所有的关系都不能同名。(关系包括:表、索引、视图、物化视图、序列、同义词、包等等)

colname

物化视图的列名。不必与表(父视图)上的列名相同。

BUILD IMMEDIATE | DEFERRED

指定创建物化视图后是否立即填充,还是等到下次刷新时再填充。

默认为immediate。

REFRESH

REFRESH可以指定物化视图的刷新方式。

  • FAST: 快速刷新即增量刷新。假设前一次刷新的时间为time1,那么使用fast模式刷新物化视图时,只向视图中添加time1以后时间主表变化过的数据。为了记录这种变化,还需要通过create materialized view log on (主表名)创建一个物化视图日志表
  • COMPLETE: 全部刷新即完全刷新。相当于重新执行一次创建物化视图的查询语句
  • FORCE: 如果可以快速刷新则进行快速刷新,否则完全刷新

REFRESH可以指定数据刷新的时间

  • ON COMMIT:在更新主表的事务提交时,刷新物化视图
  • ON DEMAND:在用户需要刷新的时候,由用户手动去刷新物化视图

默认为ON demand。

REFRESH可以指定定期刷新数据的时间

  • START WITH:指定自动刷新的起始时间
  • NEXT:指定自动刷新的时间间隔

注解

物化视图快速刷新条件:

  • 物化视图不能包含DISTINCT、子查询、GROUP BY、聚集函数、SET操作、视图、Order...By、Limit、Offset、SubLink、From子句不能有函数;
  • 物化视图不能包含易变函数(volatile function);
  • 快速刷新时,物化视图的所有主表上必须存在日志,并且所有日志表中均存在物化视图上次刷新之前的记录。
  • START WITH 和 NEXT 设置的时间都需要设置到当前之间之后,如果不指定该值,系统会根据物化视图的创建时间计算表达式来确定刷新时间。

{enable | disenable} QUERY REWRITE

指定当前的物化视图是否可用于查询改写。

默认为enable。

物化视图包含DISTINCT、SubLink、SET操作、limit、offset时,只支持全文匹配的查询重写。

subquery

指为物化视图提供数据的SELECT 查询语句。参见 SELECT

示例

drop table PROJ;
CREATE TABLE PROJ(
    ID INT,
    PROJ_NAME VARCHAR(100),
    CITY VARCHAR(20)
);
INSERT INTO PROJ VALUES(1,'人力管理系统','BEIJING');
INSERT INTO PROJ VALUES(2,'财务管理系统','BEIJING');
INSERT INTO PROJ VALUES(3,'库存管理系统','TIANJING');
INSERT INTO PROJ VALUES(4,'大火箭项目','SHANGHAI');


-- 使用简单的CREATE MATERIALIZED VIEW 建立物化视图BEIJING_PROJ
-- 来存储所有在城市BEIJING的项目
CREATE MATERIALIZED VIEW BEIJING_PROJ AS SELECT * FROM PROJ WHERE CITY='BEIJING';

SELECT * FROM PROJ;   
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
--------------------------------------------------------
3            |库存管理系统                  |TIANJING           |
--------------------------------------------------------
4            |大火箭项目                   |SHANGHAI           |
总数目:4

SELECT * FROM BEIJING_PROJ;
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
总数目:2


-- 使用BUILD deferred子句的物化视图
-- 只创建物化视图不生成数据(如果是immediate则生成数据)
CREATE MATERIALIZED VIEW BEIJING_PROJ_BUILD BUILD deferred AS SELECT * FROM PROJ WHERE CITY='BEIJING';  

SELECT * FROM PROJ; 
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
--------------------------------------------------------
3            |库存管理系统                  |TIANJING           |
--------------------------------------------------------
4            |大火箭项目                   |SHANGHAI           |
总数目:4

SELECT * FROM BEIJING_PROJ_BUILD;
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
总数目:0
    

-- 使用REFRESH子句的物化视图
-- 设置了视图的刷新方式是全量更新的
CREATE MATERIALIZED VIEW BEIJING_PROJ_REFRESH REFRESH COMPLETE ON COMMIT AS SELECT * FROM PROJ WHERE CITY='BEIJING';

SELECT * FROM PROJ;   
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
--------------------------------------------------------
3            |库存管理系统                  |TIANJING           |
--------------------------------------------------------
4            |大火箭项目                   |SHANGHAI           |
总数目:4

SELECT * FROM BEIJING_PROJ_REFRESH;
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
总数目:2
INSERT INTO PROJ VALUES(5, '超市库存管理系统', 'BEIJING');   

SELECT * FROM PROJ;    
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
--------------------------------------------------------
3            |库存管理系统                  |TIANJING           |
--------------------------------------------------------
4            |大火箭项目                   |SHANGHAI           |
--------------------------------------------------------
5            |超市库存管理系统                |BEIJING            |
总数目:5

SELECT * FROM BEIJING_PROJ_REFRESH;
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
--------------------------------------------------------
5            |超市库存管理系统                |BEIJING            |
总数目:3


-- 使用REFRESH START WITH子句的物化视图
-- 设置了视图的首次刷新时间和刷新数据的周期
CREATE MATERIALIZED VIEW BEIJING_PROJ_REFRESH_STARTWITH REFRESH START WITH SYSDATE NEXT SYSDATE + 1/4096 AS SELECT * FROM PROJ;

SELECT * FROM PROJ;
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
--------------------------------------------------------
3            |库存管理系统                  |TIANJING           |
--------------------------------------------------------
4            |大火箭项目                   |SHANGHAI           |
--------------------------------------------------------
5            |超市库存管理系统                |BEIJING            |
总数目:5

SELECT * FROM BEIJING_PROJ_REFRESH_STARTWITH;
ID(int)      |PROJ_NAME(varchar)      |CITY(varchar)      |
--------------------------------------------------------
1            |人力管理系统                  |BEIJING            |
--------------------------------------------------------
2            |财务管理系统                  |BEIJING            |
--------------------------------------------------------
3            |库存管理系统                  |TIANJING           |
--------------------------------------------------------
4            |大火箭项目                   |SHANGHAI           |
--------------------------------------------------------
5            |超市库存管理系统                |BEIJING            |
总数目:5