2013-02-20 146 views
2

我正在使用物化視圖,我無法將其設置爲快速刷新,因爲某些表來自沒有物化視圖日誌的遠程數據庫。物化視圖的創建速度很快,但刷新需要幾小時

當我創建物化視圖時,花費了20 30秒。但是當我試圖刷新它。 花了2個多小時。總記錄數僅爲46萬左右。

有沒有人有任何線索會發生什麼?

感謝

代碼看起來如下

create materialized view MY_MV1 
refresh force on demand 
start with to_date('20-02-2013 22:00:00', 'dd-mm-yyyy hh24:mi:ss') next trunc(sysdate)+1+22/24 
as 
(SELECT Nvl(Cr.Sol_Chng_Num, ' ') AS Change_Request_Nbr, 
     Nvl(Sr.Sr_Num, ' ') AS Service_Request_Nbr, 
     Nvl(Sr.w_Org_Id, 0) AS Org_Id, 
     Fcr.rowid, 
     Cr.rowid, 
     Bsr.rowid, 
     Sr.rowid, 
     SYSDATE 
    FROM [email protected] Fcr 
INNER JOIN [email protected] Cr 
    ON Fcr.w_Sol_Chng_Id = Cr.w_Sol_Chng_Id 
INNER JOIN [email protected] Bsr 
    ON Fcr.w_Sol_Chng_Id = Bsr.w_Sol_Chng_Id 
INNER JOIN [email protected] Sr 
    ON Sr.w_Srv_Rec_Id = Bsr.w_Srv_Rec_Id 
WHERE Sr.Sr_Num <> 'NS' 
); 

我曾嘗試使用DBMS_MVIEW.REFRESH( 'MY_MATVIEW', 'C',atomic_refresh =>假) 但也花費了141分鐘運行... vs 159分鐘沒有atomic_refresh =>假

+0

如果可能的話,你應該包括你的MV定義。 – Wolf 2013-02-20 16:21:06

+0

我已經上傳了我的代碼......感謝 – 2013-02-20 16:25:18

+1

當您按需刷新時,您可能會考慮傳遞'atomic_refresh => false'作爲參數來強制表格被截斷並填充。看到這個[很好的答案](http://stackoverflow.com/questions/6349274/oracle-what-happens-when-refreshing-a-refresh-force-on-demand-view-with-dbms)。 – Wolf 2013-02-20 16:46:34

回答

0

如果它只需要20-30秒創建爲什麼不只是刪除並重新創建物化視圖而不是刷新它?

+1

在我們的prod域中,我們在發生創建/刪除操作時發送審計電子郵件。我想了解爲什麼刷新比創建更長... – 2013-02-20 15:49:05

4

我個人不會使用內置在mat view中的調度器視圖CREATE語句(以......開頭的下一個子句)。

主要原因(對我來說)是你不能以這種方式聲明刷新非ATOMIC(至少在CREATE時我還沒有找到這個語法)。根據您的刷新要求和尺寸,這可以節省很多時間

我會使用dbms_mview.refresh('MY_MATVIEW','C',atomic_refresh => false)。這將:

  1. 截斷MY_MATVIEW快照表
  2. 插入追加到MY_MATVIEW表

如果在創建語句中使用的下一項,它會安裝一個原子刷新,這意味着它會:

  1. 刪除*從MY_MATVIEW
  2. 插入MY_MATVIEW
  3. 提交

這會慢一些(有時慢得多),但其他人仍然可以在刷新時從MY_MATVIEW進行查詢。所以,取決於你的情況和需求。

+0

作爲狼,你建議...我試圖運行一個與atomic_refresh =>錯誤的建議...它141分鐘刷新視圖159分鐘沒有它...尤其是當我創建視圖時20 30秒......它需要很長時間 – 2013-02-20 21:00:54

+0

「創建視圖」過去時,當其他東西運行或未在盒子上運行時,當數據不同時,緩衝區緩存不同,可能有很多因素,不確定。如果你今天刪除/創建mat view(使用build立即),然後使用dbms_mview(atomic_refresh false)刷新它,看看會發生什麼 – tbone 2013-02-20 22:04:49

+0

是的......那是我第一個想到的東西......我試過了在不同的時間範圍內從昨天晚上開始,直到今天下午...但是每當我放棄物化視圖並重新創建它時,花費的時間不會超過30秒......而當我運行命令刷新後,花了幾個小時完 – 2013-02-20 22:19:24

0

您可以測試它。我手動運行它,它適用於我的朋友:)

BEGIN 
    DBMS_REFRESH.make(
    name     => 'DB_NAME.MINUTE_REFRESH', 
    list     => '', 
    next_date   => SYSDATE, 
    interval    => '/*1:Mins*/ SYSDATE + 1/(60*24)', 
    implicit_destroy  => FALSE, 
    lax     => FALSE, 
    job     => 0, 
    rollback_seg   => NULL, 
    push_deferred_rpc => TRUE, 
    refresh_after_errors => TRUE, 
    purge_option   => NULL, 
    parallelism   => NULL, 
    heap_size   => NULL); 
END; 
/

BEGIN 
    DBMS_REFRESH.add(
    name => 'DB_NAME.MINUTE_REFRESH', 
    list => 'DB_NAME.MV_NAME', 
    lax => TRUE); 

END; /

然後你可以用它來摧毀它。

BEGIN 
    DBMS_REFRESH.destroy(name => 'DB_NAME.MINUTE_REFRESH'); 
END; 
/

您可以創建物化視圖日誌。

CREATE MATERIALIZED VIEW LOG ON DB_NAME.TABLE_NAME 
TABLESPACE users 
WITH PRIMARY KEY 
INCLUDING NEW VALUES; 

我希望它能幫助你。 :)

相關問題