MView创建语法
MView的语法图示,来自Oracle Database SQL Reference
-
ON PREBUILD TABLE
- 将已经存在的表注册为实体化视图。同时还必须提供描述创建该表的查询的 SELECT 子句。可能无法始终保证查询的精度与表的精度匹配。为了克服此问题,应该在规范中包含 WITH REDUCED PRECISION 子句。 注意:这种方法不能用于以ROWID方式建立MVIEW,因为按照ROWID方式建立的ROWID所对应的表需要包含一个隐含的ROWID列。 Build Clause
-
创建方式,决定是否在创建MV的时候生成数据。
- BUILD IMMEDIATE(默认): 在创建实体化视图的时候就生成数据
- BUILD DEFERRED: 在创建时不生成数据,以后在刷新MV的时候生成数据
Refresh
- 刷新子句,当基表发生了DML操作后,实体化视图何时采用哪种方式和基表进行同步
[
refresh
[
fast
|
complete
|
force
]
[ on demand | commit ]
[ start with date ]
[ next date ]
[ with { primary key | rowid }]
]
[ on demand | commit ]
[ start with date ]
[ next date ]
[ with { primary key | rowid }]
]
- FAST: 采用增量刷新,只刷新自上次刷新以后进行的修改
- COMPLETE: 对整个实体化视图进行完全的刷新
- FORCE(默认): Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用Fast方式,否则采用Complete的方式,Force选项是默认选项
- ON DEMAND(默认): 实体化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新
- ON COMMIT: 实体化视图在对基表的DML操作提交的同时进行刷新
- START WITH: 第一次刷新时间
- NEXT: 刷新时间间隔
(说明:指定上面两个选项的任意一个都将会在系统中产生一个新的JOB,用来对所建立的MV进行刷新,这个JOB可以从DBA_JOBS查到,同时删除MV之后该JOB也会被删除。)
- WITH PRIMARY KEY(默认): 生成主键实体化视图,也就是说实体化视图是基于表的主键,而不是ROWID(对应于ROWID子句)。 为了生成PRIMARY KEY子句,应该在表上定义主键,否则应该用基于ROWID的实体化视图。主键实体化视图允许识别实体化视图表而不影响实体化视图增量刷新的可用性
- WITH ROWID: 只有一个单一的主表,不能包括下面任何一项:Distinct,聚合函数,Group by,子查询,连接,SET操作
-
Query Rewrite
-
查询重写,包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的实体化视图是否支持查询重写。查询重写是指当对实体化视图的基表进行查询时,Oracle会自动判断能否通过查询实体化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的实体化视图中读取数据。主要用于DataWarehouse。
- ENABLE QUERY REWRITE:支持查询重写
- DISABLE QUERY REWRITE(默认):不支持查询重写
WITH Clause
-
- OBJECT ID 如果是对象实体化视图(object materialized view),则只能采用该方式
- PRIMARY KEY(默认):
- ROWID:当原表中不存在主键时需要采取这种方式。
- SEQUENCE
MView分类
按对MView可以进行的DML的操作分
按对MView可以进行的DML的操作可将MView分成三种
- 只读MView:不指定FOR UPDATE参数所创建MView为只读MView,这种MView将和原查询的数据保持一致,不会存在有数据冲突等问题。
- 可更新MView:在建立MView的时候使用FOR UPDATE参数,同时要求将MView放在刷新组里面。建立的MView可以被更新修改,而且MView的修改也会在MView刷新的时候被推到原表中。
- 可写MView:在建立MView的时候使用FOR UPDATE参数,但是不将MView放在刷新组里面。这样的MView可以被修改,但是所有的修改会在MView被刷新的时候被刷新掉。
安装MView原表的类型区分
安装MView原表的类型区可将MView分成四种
- Primary Key MView:默认情况下系统将建立Primary Key MView,这种MView需要基表存在主键。
- Object MView:当基表是由OF type语句所建立的表对象时建立的MView被称为Object MView。
- ROWID MView:在下面2种情况下需要建立基于ROWID的MView:基表没有PK或者是复合PK中只有部分列被包含在MView当中。同时也可以使用ALTER MATERIALIED VIEW mv ADD ROWID语句为现有的基于PK的MView加入ROWID列。
- 复合MView:建立在一个复合查询上面的MView被称为复合型MView,这种类型的MView最主要要注意的是MView是否能被快速刷新,即快速刷新兼容性。