- 定义
视图分类:简单视图,复杂视图,物化视图。
简单视图:
简单视图和复杂视图不占磁盘空间,实际上是一个虚表,真正数据存储 base table.
简单视图可以 dml(insert update,delete)
复杂视图:
复杂视图不允许直接 DML,需要通过触发器来完成,触发器创建时,不需要使用 before after,而将替换成 instead of.
当视图中包含以下结构之一,就是表示不可更新的视图,都不允许直接 dml:
- 具有集合操作的(union、union all、minus..)
- 具有分组函数的
- 具有 group by having start...withØ
- 具有 distinct
- 具有集合运算连接。
物化视图:
数据要单独存储,占用磁盘空间,规划表空间。物化视图的数据来自于基表,基表发生的变化,物化视图可以根据更新方式来进行数据更新。
更新方式:
- 手动(默认的方式):demand
- 自动更新:commit
如何更新:
- FAST ----快速更新
- Complete --完全更新
- Force----选择性更新
- Never---不更新。
查看物化视图:
select * from SYS.USER_MVIEWS;
- 创建
语法格式:
CREATE MATERIALIZED VIEW [<模式名>.]<物化视图名>[(<列名>{,<列名>})][BUILD
IMMEDIATE|BUILD DEFERRED][<STORAGE 子句>][<物化视图刷新选项>][<查询改写选项>]AS<查询说明>
<STORAGE 子句>::=
<查询说明>::= <表查询> | <表连接>
<表查询>::=<子查询表达式>[ORDER BY 子句]
<物化视图刷新选项> ::= REFRESH <刷新选项> {<刷新选项>} | NEVER REFRESH
<刷新选项> ::= [<刷新方法>][<刷新时机>][<刷新规则>]
<刷新方法> ::= FAST | COMPLETE | FORCE
<刷新时机> ::= [ON DEMAND | ON COMMIT] [START WITH datetime_expr | NEXT
datetime_expr]
<刷新规则> ::= WITH PRIMARY KEY | WITH ROWID
<查询改写选项>::= [DISABLE | ENABLE] QUERY REWRITE
<datetime_expr>::= SYSDATE[+<数值常量>]
参数
1. <模式名> 指明被创建的视图属于哪个模式,缺省为当前模式;
2. <物化视图名> 指明被创建的物化视图的名称;
3. <列名> 指明被创建的物化视图中列的名称;
4. [BUILD IMMEDIATE|BUILD DEFERRED] 指明 BUILD IMMEDIATE 为立即填
充数据,默认为立即填充;BUILD DEFERRED 为延迟填充,使用这种方式要求第
一次刷新必须为 COMPLETE 完全刷新。
5. <子查询表达式> 标识物化视图所基于的表的行和列。其语法遵照 SELECT 语句
的语法规则;
6. <表连接>参照表连接查询;
7. 定义查询中的 ORDER BY 子句仅在创建物化视图时使用,此后 ORDER BY 被忽略;
8. 刷新方法
- l FAST (快速刷新)
根据相关表上的数据更改记录进行增量刷新。普通 DML 操作生成的记录存在于物化视图日志。使用 FAST 刷新之前,必须先建好物化视图日志。
- COMPLETE (完全刷新)
通过执行物化视图的定义脚本进行完全刷新。
- l FORCE (选择性刷新)
默认选项。当快速刷新可用时采用快速刷新,否则采用完全刷新。
9.刷新时机
- ON DEMAND
由用户通过 REFRESH 语法进行手动刷新。如果指定了 START WITH 和 NEXT
子句就没有必要指定 ON DEMAND。
- ON COMMIT
在相关表上视图提交时进行快速刷新。刷新是由异步线程执行的,因此COMMIT 执行结束后可能需要等待一段时间物化视图数据才是最新的。
约束:
含有对象类型的不支持;
包含远程表的不支持。
- START WITH datetime_expr | NEXT datetime_expr
START WITH 用于指定首次刷新物化视图的时间,NEXT 指定自动刷新的间隔;如果省略 START WITH 则首次刷新时间为当前时间加上 NEXT 指定的间隔;如果指定 START WITH 省略 NEXT 则物化视图只会刷新一次;如果二者都未指定物化视图不会自动刷新。
10. 刷新规则
- WITH PRIMARY KEY
默认选项。
只能基于单表
Ø 必须含有 PRIMARY KEY 约束,选择列必须直接含有所有的 PRIMARY
KEY(UPPER(col_name)的形式不可接受)
Ø 不能含有对象类型
- WITH ROWID
Ø 只能基于单表
Ø 不能含有对象类型
Ø 如果使用 WITH ROWID 的同时使用快速刷新,则必须将 ROWID 提取
出来,和其他列名一起,以别名的形式显示
11. NEVER REFRESH 物化视图从不进行刷新。可以通过 ALTER MATERALIZED VIEW
<物化视图名> FRESH 进行更改;
12. QUERY REWRITE 选项
- ENABLE
允许物化视图用于查询改写。
- DISABLE
禁止物化视图用于查询改写。
目前 DM8 仅语法支持查询改写选项,实际功能未实现。
13. datetime_expr 只能是日期常量表达式,SYSDATE[+<数值常量>]或日期间隔;
14. 如果物化视图中包含大字段列,需要用户手动指定 STORAGE(USING LONG ROW)
- 举例
举例1:
create table test.t1(c1 int,c2 varchar);
insert into test.t1 values(1,'china');
insert into test.t1 values(2,'english');
commit;
create materialized view TEST.MV1 AS SELECT * FROM TEST.T1;
select * from TEST.MV1;
---修改 t1 的值,手动更新 mv1
update "TEST"."T1" set "C2" = 'chinese' where c1=1;
commit;
REFRESH materialized view test.mv1;
select * from TEST.MV1;
举例2:
create table test.t2(c1 int,c2 varchar);
alter table "TEST"."T2" add primary key("C1");
---创建一个自动更新的物化视图(要有物视图日志)
create materialized view log on test.t2;
---创建快速更新物化视图
create materialized view test.mv2 refresh fast on commit as select * from test.t2;
select * from test.mv2;
插入新的数据并提交:
insert into test.t2 values(1,'china');
insert into test.t2 values(2,'english');
insert into test.t2 values(3,'usa');
commit;
select * from test.mv2;
--创建完全更新的物化视图
create materialized view test.mv3 refresh complete on commit as select * from test.t2;
select * from test.mv3;
插入新的数据并提交:
insert into test.t2 values(1,'china');
insert into test.t2 values(2,'english');
insert into test.t2 values(3,'usa');
commit;
select * from test.mv2;