物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本,占用存储空间,即将查询出来的数据存储在数据库中。
当所依赖的一个或多个基表的数据发生更新,必须启用刷新机制才能保证数据是最新的。
物化视图可以用于数据复制(Data Replication),也可用于数据仓库缓存结果集以此来提升复杂查询的性能。
创建物化视图
DDL
create materialized view "TEST"."mv1"
build immediate
storage(initial 1, next 1, minextents 1, fillfactor 0)
refresh on demand with primary key force
as
select * from test.t1;
参数
BUILD IMMEDIATE: 立即填充。
BUILD DEFERRED: 延迟填充且第一次需要全量填充
刷新模式
FAST:根据相关表上的数据更改记录进行增量刷新。普通 DML 操作生成的记录存在于物化视图日志中。使用 FAST 刷新之前,必须先建好物化视图日志。
COMPLETE:通过执行物化视图的定义脚本进行完全刷新。
FORCE:默认选项。当快速刷新可用时采用快速刷新,否则采用完全刷新。
ON COMMIT:相关表上有数据提交时进行刷新。刷新由异步线程执行,数据同步可能存在延迟。
START WITH… NEXT:START WITH 指首次刷新的时间,省略 START WITH,首次刷新时间为当前时间。NEXT 指定刷新的时间间隔,省略 NEXT,则物化视图只刷新一次。
START WITH 或者 NEXT 均不指定,不会自动执行物化视图刷新。
ON DEMAND:用户可通过 REFRESH 语法手动刷新,不能和 START WITH 一起使用。
NEVER REFRESH:物化视图从不刷新。
刷新依据
WITH PRIMARY KEY 基于主键
只能基于单表
必须含有 PRIMARY KEY 约束,选择列必须直接含有所有的 PRIMARY,KEY(UPPER(col_name) 的形式不可接受)
不能含有对象类型
WITH ROWID 基于 rowid
只能基于单表
不能含有对象类型
若同时使用 WITH ROWID 及快速刷新,则必须将 ROWID 提取出来,和其他列名一起,以别名的形式显示
物化视图分类
按物化视图的使用场景,主要分为如下五大类:
SIMPLE:无 GROUP BY、无聚集函数、无连接操作
AGGREGATE:仅包含 GROUP BY 和聚集函数
JOIN:仅包含多表连接
Sub-Query:仅包含子查询
COMPLEX:除上述四种外的物化视图类型
默认创建物化视图
是手动更新
举例:
CREATE MATERIALIZED VIEW TEST.mv1 AS SELECT * FROM TEST.T1;
手动更新
REFRESH MATERIALIZED VIEW TEST.mv1;
创建物化日志
当基表上有 DML 操作时,系统将变化记录在日志表里,然后使用这些日志刷新到物化视图,这种刷新方式为快速刷新。通过快速刷新避免了全量刷新,也降低了同步数据的开销。
CREATE MATERIALIZED VIEW LOG ON TEST.T1 WITH PRIMARY KEY;
创建好后会自动建立一个触发器
创建自动更新的物化视图
CREATE MATERIALIZED VIEW LOG on TEST.T1 WITH PRIMARY KEY;
CREATE MATERIALIZED VIEW TEST.mv2 REFRESH COMPLETE ON COMMIT as SELECT * from TEST.T1;
CREATE MATERIALIZED VIEW TEST.mv3 REFRESH FAST ON COMMIT AS SELECT * FROM TEST.T1;
更改刷新方式为快速更新
ALTER MATERIALIZED VIEW TEST.MV1 REFRESH FAST;
复杂物化视图
支持快速刷新的物化视图,称为复杂物化视图。以下均为不能创建复杂物化视图场景,具体限制为:
不能含有不确定性函数,如 SYSDATE 或 ROWNUM。
不能含有大字段类型。
查询项不能含有分析函数。
查询不能含有 HAVING 子句。
不能包含 ANY、ALL 及 NOT EXISTS。
不能含有层次查询。
不能在多个站点含有相关表。
同一张表上最多允许建立 127 个快速刷新的物化视图。
不能含有 UNION,UNION ALL,MINUS 等集合运算。
不能含有子查询。
只能基于普通表(视图,外部表,派生表等不支持)。
DM8 目前仅支持简单类型和部分连接物化视图的快速刷新,连接物化视图不支持的具体类型是外连接和自然连接。
连接物化视图不支持 GROUP BY 和聚集操作。