视图与物化视图
一、视图
创建视图语法结构:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
语法解析:
- OR REPLACE :若所创建的试图已经存在,则替换旧视图;
- FORCE:不管基表是否存在ORACLE都会自动创建该视图(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用);
- NOFORCE :如果基表不存在,无法创建视图,该项是默认选项(只有基表都存在ORACLE才会创建该视图)。
- alias:为视图产生的列定义的别名;
- subquery :一条完整的SELECT语句,可以在该语句中定义别名;
- WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;
- WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
例如:
create view v_emp as select * from emp where deptno = 30;
删除视图
DROP VIEW v_emp
二、物化视图
创建物化视图语法结构:
CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED ]①
REFRESH [FAST|COMPLETE|FORCE]②
[ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT(next_time)]③
AS subquery
语法解析:
① 二选一,默认是 BUILD IMMEDIATE。
- BUILD IMMEDIATE 创建物化视图的时候就生成数据;
- BUILD DEFERRED 创建时不生成数据,以后根据需要再生成。理解为创建一个空的视图。
② REFRESH:当基表发生 DML 操作后,物化视图何时采用哪种方式和基表同步数据。
REFRESH 后面跟着的刷新方法有:FAST、COMPLETE、FORCE。
- FAST:增量刷新,只刷新自上次刷新以后进行的修改。
- COMPLETE:对整个物化视图进行完全的刷新,相当于先 truncate 再 insert。
- FORCE:默认的刷新方式。刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。
③ 刷新的模式有两种:
- ON DEMAND 需要手动刷新物化视图。默认为 ON DEMAND
- ON COMMIT 在基表发生 COMMIT 操作时刷新。
例如:
create materialized view my_materialized
refresh complete
on demand start with sysdate next
to_date(concat(to_char(sysdate + 1,'dd-mm-yyyy'),'00:03:00'),'dd-mm-yyyy hh24:mi:ss')
as select * from user_info;
这个物化视图表示从当前日期开始,往后每天 00:03 进行全量覆盖刷新。
删除物化视图
drop materialized view mv_name