2013-11-20 46 views
8

我剛剛創建的表DEPT和EMP類似如下的觀點:上提交的快速刷新物化

create table DEPT 
(dept_no number , dept_name varchar(32) , dept_desc varchar(32), 
    CONSTRAINT dept_pk Primary Key (dept_no)); 

create table EMP 
(emp_no number, dept_no number, CONSTRAINT emp_pk Primary Key (emp_no,dept_no)); 

insert into dept values (10,'it','desc1'); 
insert into dept values (20,'hr','desc2'); 

insert into emp values (1,10); 
insert into emp values (2,20); 

我創建物化在這些表的rowid查看日誌和物化視圖如下:

create materialized view log on emp with rowid; 
create materialized view log on dept with rowid; 

create materialized view empdept_mv refresh fast on commit as 
select a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no,b.emp_no 
from dept a, emp b 
where a.dept_no=b.dept_no ; 

select * from emp; 
    EMP_NO DEPT_NO 
    ---------- ---------- 
    1   10 
    2   20 
    3   30 

select * from dept; 
    DEPT_NO DEPT_NAME      DEPT_DESC 
---------- -------------------------------- -------------------------------- 
    10 it        desc1 
    20 hr        desc2 
    30 it        desc3 

select * from empdept_mv; 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 

我插入了一條新記錄並執行了COMMIT; ..但仍然當我檢查物化視圖時,新記錄未顯示在物化視圖中。

insert into dept values (30,'it','desc3'); 
commit; 
insert into emp values (3,30); 
commit; 

select * from empdept_mv; 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 

現在,當我運行快速,徹底刷新程序爲per,快速刷新不更新MView的,但完全刷新呢。 (注:但MVIEW仍然刷新COMMIT

execute DBMS_MVIEW.REFRESH('empdept_mv', 'F', '', TRUE, FALSE, 0,0,0,FALSE, FALSE); 
PL/SQL procedure successfully completed. 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 


execute DBMS_MVIEW.REFRESH('test_mview2', 'C', '', TRUE, FALSE, 0,0,0,FALSE, FALSE); 
PL/SQL procedure successfully completed. 

DEPT_ROWID   EMP_ROWID    DEPT_NO  EMP_NO 
------------------ ------------------ ---------- ---------- 
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA   10   1 
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB   20   2 
AAAli5AABAAAPZ6AAC AAAli7AABAAAQs6AAC   30   3 

的DBMS_MVIEW.EXPLAIN_MVIEW輸出是如下所示:(capability_name --Possible-- msgtxt)

  1. PCT --N- -
  2. REFRESH_COMPLETE --Y--
  3. REFRESH_FAST --Y--
  4. REWRITE --N--
  5. PCT_TABLE --N-- Oracle錯誤:看到RELATED_NUM和RELATED_TEXT爲 細節
  6. REFRESH_FAST_AFTER_INSERT --Y--
  7. REFRESH_FAST_AFTER_ONETAB_DML --Y--
  8. REFRESH_FAST_AFTER_ANY_DML --Y--
  9. REFRESH_FAST_PCT - N-- PCT是不可能在配接任何細節的 表
  10. REWRITE_FULL_TEXT_MATCH --N-- Oracle錯誤:看到RELATED_NUM和 RELATED_TEXT的細節
  11. REWRITE_FULL_TEXT_MATCH --N--查詢重寫爲d isabled上 物化視圖
  12. REWRITE_PARTIAL_TEXT_MATCH --N--物化視圖不能支持任何 類型的查詢重寫
  13. REWRITE_PARTIAL_TEXT_MATCH --N--查詢重寫被禁用在 物化視圖
  14. REWRITE_GENERAL --N - 化視圖不能支持任何類型的 查詢重寫
  15. REWRITE_GENERAL --N--查詢重寫是在物化視圖
  16. REWRITE_PCT --N--一般重寫是不可能的或PCT禁用是不是 可能在一個
  17. PCT_TABLE_REWRITE --N-- Oracle錯誤:看到RELATED_NUM和 RELATED_TEXT的細節

我如何才能實現快速刷新ON COMMIT?
Oracle版本詳細信息如下:
NLSRTL 10.2.0.4。0生產
Oracle數據庫10g 10.2.0.4.0 64位生產
PL/SQL 10.2.0.4.0生產
TNS針對Linux:10.2.0.4.0生產

+0

它適合我。你可能想添加你的'創建物化視圖日誌...'和你的插入,所以我們可以完全重現這個問題。 –

+0

您沒有顯示任何數據,也沒有說明您將該行插入哪個表。當你運行定義MV查詢的select語句時,你看到新行嗎? –

+0

我已經包含了所有的插入語句。是的,我可以在表中插入後看到新的一行。 –

回答

1

我看到你創建的物化視圖日誌與ROWID,這是不是真的需要,因爲這兩個表都有一個主鍵,所以你可以嘗試沒有ROWID。

創建物化視圖登錄emp; 創建物化視圖登錄部門;

此外,如果使用ROWID創建物化視圖日誌,則應使用rowid創建物化視圖。

創建物化視圖empdept_mv從部門一個刷新快速上WITH ROWID提交作爲 選擇a.rowid dept_rowid,b.rowid emp_rowid,a.dept_no,b.emp_no ,EMP b 其中a.dept_no = b.dept_no ;

您可以嘗試這些更改並查看實例化視圖是否在提交時快速刷新。

2

我不知道,如果問題仍然存在,但正如我在您提供的條每頁接過一看,我發現了一些(這可能只是這裏的解決方案):

ON COMMIT刷新

物化視圖可以使用ON COMMIT方法自動刷新。因此,無論何時提交已更新定義了實例化視圖的表的事務,這些更改都會自動反映到實例化視圖中。使用這種方法的好處是你永遠不必記得刷新物化視圖。 唯一的缺點是由於涉及額外的處理,完成提交所需的時間會稍長一些。但是,在數據倉庫中,這不應該成爲問題,因爲併發進程不太可能會嘗試更新同一個表。

  • 注意粗線。

然後我們有:

表7-1 ON DEMAND刷新方法

刷新選項參數說明 COMPLETEÇ刷新通過重新計算物化視圖的定義查詢

FAST F 通過逐步應用對物化視圖的更改進行刷新。對於本地實例化視圖,它選擇優化器估計的刷新方法效率最高。所考慮的刷新方法是基於日誌的FAST和FAST_PCT。

FAST_PCT P通過重新計算物化視圖中受更改的分區影響的細節表中的行刷新。

FORCE?嘗試快速刷新。如果這是不可能的,它會徹底刷新。 對於本地實例化視圖,它選擇優化器估計的刷新方法效率最高。所考慮的刷新方法是基於日誌的FAST,FAST_PCT和COMPLETE。

  • 注意粗線。
  • 我個人比較喜歡FORCE選項。

你能告訴,如果一段時間後再次出現(取決於數據庫,並在其上運行的機器的參數,所以我甚至不能提示你多少)?

當快速刷新,可以

不是所有的物化視圖可以快速刷新。因此,使用包DBMS_MVIEW.EXPLAIN_MVIEW來確定哪些刷新方法可用於物化視圖。

如果你不知道如何使物化視圖快速刷新,您可以使用DBMS_ADVISOR.TUNE_MVIEW程序,其中包含了創建快速刷新所需的語句的腳本物化視圖。

乾杯