在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, rown
当LGWR处于空闲状态时,它依赖于rdbms rpc message等待事件,处于休眠状态,直到三秒时间到,如果这个时候LGWR发现有Redo信息需要写出的话,那么LGWR将执行写的操作,log file parallel write等待事件将会出现。
总结一下Redo写的触发条件:
1,每三秒钟超时(timeout):
当LGWR处于空闲状态时,它依赖于rdbms r ......