在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, 否則你慘了).