Oracle实体化视图
简介:
MView中文名称为实体化视图(Materialized View),相对于普通的视图来说,MView的不同之处在于MView实体化视图管理存储数据,占据数据库的物理空间。MView的结果会保存在一个普通的数据表中,在对MView进行查询的时候不再会对创建MView的基表进行查询,而是直接查询MView对应的结果表,然后通过定期的刷新机制来更新MView表中的数据。
物化视图可以查询表,视图和其它的物化视图。
MView在实际中的主要作用:
1、减轻网络负担:通过MV将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担。
2、搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数据的目的。
3、复制数据子集:MV可以进行行级/列级的筛选,这样可以复制需要的那一部分数据。
实体化视图是用于汇总,预计算,复制或分发数据的对象, 在大型的数据库中使用它可以提高涉及到的SUM,COUNT,AVG,MIN,MAX等的表的查询的速度。
创建实体化视图管理的用户的权限必须有: CREATE ANY MATERIALZED VIEW,CREATE TABLE,CREATE VIEW,SELECT等。
创建实体化视图:
创建物化视图主要语法:
create materialized view [view_name]
{TABLESPACE (表空间名)} --保存表空间
{BUILD [DEFERRED|IMMEDIATE(默认值)]} --延迟刷新还是立即刷新
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)
]
as
{创建物化视图用的查询语句}
相关参数说明:
1,
Build子句:定义创建方式,包括BUILD IMMEDIATE和BUILD DEFERRED两种
BUILD IMMEDIATE 在创建实体化视图的时候就生成数据,默认 BUILD IMMEDIATE
BUILD DEFERRED 在创建时不生成数据,以后根据需要在生成数据
2,
Refresh子句:定义数据同步刷新,当基表发生了DML操作后,实体化视图何时采用哪种方式和基表进行同步,语法:
[refresh [fast | complete | force]
[on demand | commit]
[start with date]
[next date]
[with {primary key | rowid}]
]
FAST 采用增量刷新,只刷新自上次刷新以后进行的修改,如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志,如果没有建立MView Log的话要进行快速刷新的话会报错
注意:对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。
COMPLETE 对整个物化视图进行完全的刷新
FORCE(默认) Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用Fast方式,否则采用Complete的方式,Force选项是默认选项
ON DEMAND(默认) 物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新
ON COMMIT 实体化视图在对基表的DML操作提交的同时进行刷新
START WITH 第一次刷新时间
NEXT 刷新时间间隔
WITH PRIMARY KEY(默认) 生成主键实体化视图,也就是说实体化视图是基于表的主键,而不是ROWID(对应于ROWID子句)。 为了生成PRIMARY KEY子句,应该在表上定义主键,否则应该用基于ROWID的实体化视图。主键实体化视图允许识别实体化视图表而不影响实体化视图增量刷新的可用性
WITH ROWID 只有一个单一的主表,不能包括下面任何一项:
●Distinct
●聚合函数
●Group by
●子查询
●连接
●SET操作
3,
Query Rewrite子句,定义查询重写
包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的实体化视图是否支持查询重写。查询重写是指当对实体化视图的基表进行查询时,Oracle会自动判断能否通过查询实体化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的实体化视图中读取数据
ENABLE QUERY REWRITE 支持查询重写
DISABLE QUERY REWRITE 不支持查询重写,默认DISABLE QUERY REWRITE
注意:如果需要进行快速刷新,则需要建立实体化视图日志。实体化视图日志根据不同实体化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。
创建多表关联的实体化视图:
实体化视图包含多表关联,但不包含聚合操作,仅包含表关联的实体化视图同样支持在两种情况下刷新:
ON COMMIT 和 ON DEMAND。在 ON COMMIT 下,当基表发生DML操作并提交commit 的时候,实体化视图被刷新。
Oracle不允许实体化视图中有self-jions 的存在。
假如指定刷新方式为REFRESH FAST, oracle 执行附加的校验,以确定fast refresh能被执行。这些附加的检查包括:
1 每个基表下必须创建相应的 materialized view log
2 每个基表的rowid 必须在实体化视图的select 语句中出现
3 如果存在外联接,在where 子句不能有任何的selections.并且,所有的关联必须以AND 相连,并且用“=”操作符。
4 如果存在外联接,唯一性约束必须存在于外联的 inner table 的相关列中。
创建聚合类型的实体化视图:
为了能够进行快速刷新(fast refersh),在select 语句中必须包含所有在group by中出现的列名,并且必须有一个count(*),所有在gorup by 中出现的列都必须有一个count(列名)出现在select 中。同样,所有于实体化视图相关的表上都必须创建实体化和视图日志。有效的聚合函数包括:
SUM, COUNT(x),COUNT(*),AVG,VARIANCE,STDDEV,MIN,MAX被聚合的值可以是任何的
sql表达式。
REFRESH FAST 总结:
一个包含关联和聚合的实体化视图是可能的。但有如下限制:
1,实体化视图中不能包含非复用的表达式(具有实时特征的)。比如SYSDATE and ROWNUM.
2,实体化视图中不能包含RAW or LONG 数据类型。
3,实体化视图相关的表必须创建实体化视图日志,并且满足如下条件
包含被实体化视图引用到的所有的列。指定with rowid和INCLUDING NEW VALUES.
如果表的预期操作是inserts/direct-loads, deletes, and updates的混合,指定SEQUENCE子句只用SUM,COUNT,AVG,STDDEV,VARIANCE,MIN and MAX支持fast refresh.
对于每个聚合agg(expr),必须相应写一个count(expr)与之对应.
如果VARIANCE(expr)or STDDEV(expr)被指定,那么COUNT(expr)and SUM(expr) 必须被指定。在select列表中必须包含所有group by中出现的列.如果实体化视图有如下的一点,那么fast refresh 只支持常规DML inserts和直接路径的装载(direct loads)
a 实体化视图包含MIN 或者 MAX
b 实体化视图包含SUM(expr)但是没有COUNT(expr)
c 实体化视图中不包含COUNT(*)
如上的实体化视图称之为insert-only materialized view.
包含MAX or MIN实体化视图在delete或者混合的DML操作之后可以是 fast refresh,条件是视图中没有where 子句。
(10g以上适用)
如果没有外联接,在where 子句中可以包含有选择性的条件和关联
如果实体化视图中包含外联接,fast refresh只支持在outer table被修改的情况。同样,唯一性约束必须存在于inner join table中。如果有外联,所有的关联条件都必须用 AND 连接和必须用 = 操作符。