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