我有一個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。當我開始談論分區切換時,我的團隊領導變得緊張。 :-)
我不確定我是否理解你已經提出的構造,如何幫助解決問題,顯式鎖提供了什麼好處,或者在兩者之間做了笛卡爾連接的查詢有什麼作用表有。您能否詳細介紹一下提議的解決方案? –
查詢不是真正的查詢,只是爲了顯示構造。 這個想法是有一個進程執行查詢和另一個執行刷新。 由於每個會話都被迫等待另一個放棄鎖定,所以其中只有一個會話在任何時候都有控制權。 –
因此,只有一個會話運行查詢? –