2012-11-21 86 views
0

我有一個Oracle 11g數據庫中的幾個MV,當它不是原子時,它可以很快地完全刷新。 新的要求意味着它們必須是。在不影響查詢的情況下截斷oracle mview

我知道,當非原子DBMS_MVIEW.REFRESH在一系列插入操作之前執行截斷操作,但是當atomic => true時,所有記錄都會先被逐個刪除。只需刪除記錄需要一個多小時,而非原子版本只需幾分鐘。

我需要一種方法來允許對這個MV的查詢繼續,而我刷新它。 FAST刷新方法不存在問題,因爲MV查詢使用計數,並且mosts記錄無論如何都會有變化。

所以,我拿出結構是這樣的:

LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE; 
SELECT * FROM FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2; 
COMMIT; 

LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE; 
EXECUTE DBMS_MVIEW.REFRESH('FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2','cc'); 
COMMIT; 

有沒有更好的辦法? NB。當我開始談論分區切換時,我的團隊領導變得緊張。 :-)

+0

我不確定我是否理解你已經提出的構造,如何幫助解決問題,顯式鎖提供了什麼好處,或者在兩者之間做了笛卡爾連接的查詢有什麼作用表有。您能否詳細介紹一下提議的解決方案? –

+0

查詢不是真正的查詢,只是爲了顯示構造。 這個想法是有一個進程執行查詢和另一個執行刷新。 由於每個會話都被迫等待另一個放棄鎖定,所以其中只有一個會話在任何時候都有控制權。 –

+0

因此,只有一個會話運行查詢? –

回答

0

你注意到當你開始談論分區切換時,你的團隊負責人感到緊張。這是否表明您已經獲得了分區選項的許可?如果我們可以解決團隊領導的任何問題,這將是一種可能性?或者這是否表明我們應該放棄這一選擇?

如果分區切換不是一個選項,那麼這種方法會有一個同義詞,您可以從指向一個表(或物化視圖)的另一個表中翻轉。因此,例如

  • 重命名FOOBAR_MVIEW_DATA1FOOBAR_MVIEW_DATA1_BASE1
  • 創建一個同義詞FOOBAR_MVIEW_DATA1FOOBAR_MVIEW_DATA1_BASE1
  • 創建一個空表FOOBAR_MVIEW_DATA1_BASE2,其結構爲FOOBAR_MVIEW_DATA1_BASE1
  • 當你想刷新物化視圖一樣,將數據插入FOOBAR_MVIEW_DATA1_BASE2並在預建表上創建實體化視圖。
  • 一旦數據被刷新,點代名詞FOOBAR_MVIEW_DATA1FOOBAR_MVIEW_DATA1_BASE2
  • 在當現有的查詢都是完整的未來的某個時刻,你可以截斷FOOBAR_MVIEW_DATA1_BASE1。並且您可以選擇重命名FOOBAR_MVIEW_DATA1_BASE1FOOBAR_MVIEW_DATA1_BASE2,以便您始終可以在物化視圖刷新(_BASE1有數據且_BASE2爲空)時始終具有相同的起點,或者可以編寫刷新代碼以檢查同義詞指向的位置並加載任何表未被同義詞引用。
+0

我相信原因是我們只有生產數據庫有分區切換,所以開發和測試都是有問題的。你的同義詞的想法已經被考慮過了,但是有2個MV,我不確定是否他們之間的不一致會被接受。我在上面的示例中簡化了一些東西,但實際上有兩個查詢檢索不同但相關的數據。結果需要匹配。如果我能說服我的TL使用分區交換,它能解決這個問題嗎? –

+0

糾正;這是一個連接兩個MV的查詢。 –

相關問題