在Query Rewrite中大家看到这个技术离不开一样东西, 实体化视图, 简称MVIEW. 这是Oracle在8i中首先推出的技术, MVIEW除了在Query Rewrite中使用外, 还在Master - Slave复制中有很重要的作用, 在这儿我们主要关心Query Rewrite相关的地方, Oracle在Query Rewrite方面越来越强了, 在Oracle 8i中基本上是Text Match的Query Rewrite, 在9i/10g中有很大的更新了, 还支持一般的Query Rewrite(指Text Match以外的), 如可以试一下最后一个SQL语句, 在8i中不能rewrite, 而在9i中却可以:
SQL> desc mvtest8
Name Null? Type
------------------------------ -------- -----------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)SQL> create materialized view mv8_test
2 enable query rewrite
3 as
4 select owner,count(*) rowcnt from mvtest8
5 group by owner;SQL> select count(*) from mvtest8 where owner='SYS';
在应用MVIEW实现Query Rewrite时, 需要对MVIEW有一个基本的了解, 主要要理解以下两点:
1, MVIEW的设计, 可以满足多少SQL的Rewrite.
2, MVIEW的刷新, MIVEW是一个中间表, 数据不一定能最新, 对于大量的数据刷新方法也是很重要的.
其实在这两点之间是有些冲突的, 要实现第一点, 可能复杂的MVIEW定义有利于提高Query Rewrite后的执行效率, 但复杂的MVIEW每次刷新都可能要抄描全部记录, 对于MVIEW刷新, 在有MVIEW LOG有情况下, MVIEW可以实现增量刷新的, 一般来说要实现增量刷新需要满足下面这样的条件:
1, MVIEW的SQL中不能包函返回值不确定的函数, 如sysdate, rownum等等.
2, MVIEW的SQL中只包括汇总时,最好将COUNT(*), COUNT(字段) 这样的分组函数加进去.
3, MVIEW的SQL中只包括Join时.
关于创建MVIEW和MVIEW LOG的语法在这儿就不说了, MVIEW的刷新有三种选项, FULL: 完全刷新; FAST: 利用MVIEW LOG进行增量刷新; FORCE: 如果不能用FAST, 就用FULL. 对于刷新的时机主要有两种, ON DEMAND: 手工刷新(Crontab, Job, Schedule等), ON COMMIT: 在Commit后进行马上刷新(必须是Fast, 否则你惨了).