2011-03-17 33 views
1

我有一個桌子女巫是在激烈的工作量,以免說T1(約100更新每秒,約300k行)在Oracle中預定錶快照?

而在第二個表T2我想更新行,基於他們在T1狀態,我知道它可以很容易地通過觸發器來完成,但在我的場景中,觸發器會對性能產生巨大影響,並將T1性能降低到每秒約10次更新...

現在我創建了臨時表T3並將其選中T1狀態,之後我使用T3進行T1合併。

但仍然SELECT INTO臨時表花費很大。

有什麼辦法可以實現我的場景,而不需要大量減少T1上的更新操作?

+0

數據有多新鮮? – 2011-03-17 20:43:23

+0

我想,那T2更新/同步每5分鐘就足夠了 – canni 2011-03-17 20:51:04

回答

2

一般來說,如果您發現自己定期更新T2基於T1中的數據聽起來像一個非常OLTP類型的系統,我會對數據模型有疑問。這意味着我缺乏與之相關的標準化。您可能擁有一個完全合法的理由,即擁有一個單獨的T2表來複制T1中的某些數據(即,您嘗試支持帶有非規範化對象的DSS類型查詢,以及具有規範化對象的OLTP類型查詢)在這種情況下,瞭解T2的商業目的將會非常有用。

如果這是一個嘗試支持DSS類型查詢與非規範化對象組合來自多個規範化表的數據的情況,我的第一個想法是將T2創建爲物化視圖,而不是表。您的物化視圖可以按照計劃的時間間隔進行增量式刷新(它也可以在提交更改時刷新,但由於這種情況會同步發生,所以可能會降低插入會話的速度)。您需要在基表上創建實例化的視圖日誌,這會爲DML操作增加一些開銷,但是它將小於觸發器的開銷,特別是如果每​​個更新都更新300行(假設300k是行更新爲每秒100次更新)。

您也可以使用Streams來維護T2。這基本上消除了跟蹤DML操作變化的開銷,因爲Streams只是讀取重做數據。如果尚未啓用補充日誌記錄,這可能會稍微增加寫入重做的數據量,但您不得不啓用補充日誌記錄,但這不太可能會引起注意。然而,配置Streams需要多一點工作 - 您需要編寫一個自定義應用處理程序,以便從T1和更新T2中進行更改。而且T2總會在T1之後至少延遲幾秒鐘。

+0

呵呵,我的英文不太好,我也不太瞭解你的回答,但是會花一些時間去試試:)而300k是行數在T1表中,更新總是影響1行。另外,我不想讓T2在線更新,T1狀態下5-10分鐘的延遲可以接受 – canni 2011-03-17 21:01:51

+0

@ canni-物化視圖可以隨時刷新,無論你想要什麼間隔。所以你可以每5分鐘刷新一次,每10分鐘刷新一次或者適當的間隔。 – 2011-03-17 21:08:43

+0

謝謝,我會看看物化視圖 – canni 2011-03-17 21:12:03

0

如果您對更改的數據感興趣並且不希望觸發器記錄它們,請查看Change Data Capture,Streams或Golden Gate。罐頭都會爲您呈現邏輯變更記錄。爲此,您可以閱讀redolog,並且不要通過用觸發器擊中前景流程來干擾前景流程。另一種選擇可能是讓你的桌子看起來很好看,看看你是否可以重新安排它們。只要你可以將大部分表格定義爲歷史(和靜態),你就有更多的選擇。