物化视图能够选择三种不一样的刷新方式,根据不一样的需求,选择不一样的刷新方式。
- Complete刷新:会删除表中的全部记录(若是是单表刷新,可能会采用Truncate的方式),而后根据物化视图中查询语句的定义从新生成物化视图。
- Fast刷新:采用增量刷新的机制,只将自上次刷新之后对基表进行的全部操做刷新到物化视图中。
- Force刷新:Oracle自动判断是否知足Fast刷新条件,若是知足则进行Fast刷新,不然进行Complete刷新。
不是全部的物化视图均可以进行Fast刷新,只有知足某些条件的物化视图才具备Fast刷新的能力。根据查询的不一样,Fast刷新的限制条件也有所不一样,下面是关于Fast刷新针对不一样类型的物化视图的限制条件的总结。
- 1.全部类型的快速刷新物化视图都必须知足的条件:
- 物化视图不能包含对不肯定表达式的引用,如SYSDATE和ROWNUM;
- 物化视图不能包含对LONG和LONG RAW数据类型的引用。
- 2.针对只包含多表关联的物化视图的限制条件:
- 必须知足全部快速刷新物化视图都知足的条件;
- 不能包括GROUP BY语句或汇集操做;
- 若是在WHERE语句中包含外链接,那么惟一约束必须存在于链接中内表的链接列上;
- 若是不包含外链接,那么WHERE语句没有限制,若是包含外链接,那么WHERE语句中只能使用AND链接,而且只能使用“=”操做。
- FROM语句列表中全部表的ROWID必须出如今SELECT语句的列表中。
- FROM语句列表中的全部表必须创建基于ROWID类型的物化视图日志。
例如:
1 创建一个能够成功快速刷新的例子,这个物化视图只包含链接: SQL> create materialized view log on dim_a with rowid; 物化视图日志已建立。 SQL> create materialized view log on dim_b with rowid; 物化视图日志已建立。 SQL> create materialized view log on fact with rowid; 物化视图日志已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid a_rowid, b.rowid b_rowid, f.id, 3 a.name a_name, b.name b_name, num 4 from fact f, dim_a a, dim_b b 5 where f.aid = a.id 6 and f.bid = b.id; 物化视图已建立。
- 3.针对汇集的物化视图的限制条件:
- 必须知足全部快速刷新物化视图都知足的条件;
- 物化视图查询的全部表必须创建物化视图日志,且物化视图日志必须知足下列限制:
- 包含物化视图查询语句中的全部列,包括SELECT列表中的列和WHERE语句中的列;
- 必须指明ROWID和INCLUDING NEW VALUES;
- 若是对基本的操做同时包括INSERT、UPDATE和DELETE操做(即不是只包含INSERT操做),那么物化视图日志应该包括SEQUENCE。
- 容许的汇集函数包括:SUM、COUNT、AVG、STDDEV、VARIANCE、MIN和MAX;
- 必须指定COUNT(*);
- 若是指明了除COUNT以外的汇集函数,则COUNT(expression)也必须存在;好比:包含SUM(a),则必须同时包含COUNT(a)。
- 若是指明了VARIANCE(expression)或STDDEV(expression),除了COUNT(expression)外,SUM(expression)也必须指明;Oracle推荐同时包括SUM(expression*expression)。
- SELECT列表中必须包括全部的GROUP BY列;
- 当物化视图属于下面的某种状况,则快速刷新只支持常规DML插入和直接装载,这种类型的物化视图又称为INSERT-ONLY物化视图;
- 物化视图包含MIN或MAX汇集函数;
- 物化视图包含SUM(expression),可是没有包括COUNT(expression);
- 物化视图没有包含COUNT(*)。
- 注意:若是创建了这种物化视图且刷新机制是ON COMMIT的,则会存在潜在的问题。当出现了UPDATE或DELETE语句,除非手工彻底刷新解决这个问题,不然物化视图至此之后都再也不自动刷新,且不会报任何错误。
- 若是包含inline views、outer joins、self joins或grouping set,则兼容性的设置必须在9.0以上;
- 若是物化视图创建在视图或子查询上,则要求视图必须能够彻底合并的。
- 若是没有外链接,则对WHERE语句没有限制。若是包含外链接,则要求WHERE语句只能包括AND链接和“=”操做。对于包含外链接的汇集物化视图,快速刷新支持outer表的修改。且inter表的链接列上必须存在惟一约束。
- 对于包含了ROLLUP、CUBE、GROUPING SET的物化视图必须知足下列限制条件:
- SELECT语句列表中应该包含GROUPING标识符:能够是GROUP BY表达式中全部列的GROUPING_ID函数,也能够是GROUP BY表达式中每一列的GROUPING函数;例如:GROUP BY语句为:GROUP BY CUBE(a, b),则SELECT列表应该包括GROUPING_ID(a, b)或者GROUPING(a)和GROUPING(b)。
- GROUP BY不能产生重复的GROUPING。好比:GROUP BY a, ROLLUP(a, b)则不支持快速刷新,由于包含了重复的GROUPING:(a), (a, b), (a)。
例如:
1. 创建能够成功快速刷新的例子,这个物化视图只包含汇集: SQL> create materialized view log on fact with rowid, sequence (aid, num) 2 including new values; 物化视图日志已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select aid, count(*) count, count(num) count_num, sum(num) sum_num 3 from fact group by aid; 物化视图已建立。 2. 创建快速刷新的例子,物化视图包含汇集和链接: SQL> create materialized view log on fact with rowid, sequence (aid, num) 2 including new values; 物化视图日志已建立。 SQL> create materialized view log on dim_a with rowid, sequence (id, name) 2 including new values; 物化视图日志已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select name, count(*) count, count(num) count_num, sum(num) sum_num 3 from fact, dim_a where aid = dim_a.id group by name; 物化视图已建立。
- 4.针对包含UNION ALL的物化视图的限制条件
- UNION ALL操做必须在查询的顶层。能够有一种状况例外:UNION ALL在第二层,而第一层的查询语句为SELECT * FROM;
- 被UNION ALL操做链接在一块儿的每一个查询块都应该知足快速刷新的限制条件;
- SELECT列表中必须包含一列维护列,叫作UNION ALL标识符,每一个UNION ALL分支的标识符列应包含不一样的常量值;
- 不支持外链接、远端数据库表和包括只容许插入的汇集物化视图定义查询;
- 不支持基于分区改变跟踪(PCT)的刷新;
- 数据库的兼容性设置应设置为9.2.0。
例如:
1.创建一个符合快速刷新条件的UNION ALL物化视图 SQL> create materialized view log on dim_a with rowid; 物化视图日志已建立。 SQL> create materialized view log on dim_b with rowid; 物化视图日志已建立。 SQL> create materialized view log on fact with rowid; 物化视图日志已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid row_id, a.name name, num, 'a' marker 3 from fact f, dim_a a 4 where f.aid = a.id 5 union all 6 select f.rowid f_rowid, b.rowid row_id, b.name name, num, 'b' marker 7 from fact f, dim_b b 8 where f.bid = b.id; 物化视图已建立。
- 5.针对嵌套物化视图的限制条件
- 嵌套物化视图的每层都必须知足快速刷新的限制条件;
- 对于同时包含汇集和链接的嵌套物化视图,不支持ON COMMIT的快速刷新。
例如:
SQL> create materialized view log on dim_a with rowid; 物化视图日志已建立。 SQL> create materialized view log on dim_b with rowid; 物化视图日志已建立。 SQL> create materialized view log on fact with rowid; 物化视图日志已建立。 SQL> create materialized view mv_fact refresh fast on commit as 2 select f.rowid f_rowid, a.rowid a_rowid, b.rowid b_rowid, f.id, 3 a.name a_name, b.name b_name, num 4 from fact f, dim_a a, dim_b b 5 where f.aid = a.id 6 and f.bid = b.id; 物化视图已建立。 SQL> create materialized view log on mv_fact with rowid, sequence (a_name, num) 2 including new values; 物化视图日志已建立。 SQL> create materialized view mv_mv_fact refresh fast on commit as 2 select a_name, count(*) count, count(num) count_num, sum(num) sum_num 3 from mv_fact 4 group by a_name; 物化视图已建立。