2016-10-25 50 views
1

我們正在使用sqlplus從一個大型表上使用sqlplus卸載數據,這個大型表上每天有500列以及大約1500萬條記錄。 查詢失敗,因爲oracle無法爲結果集分配所需的內存。 微調oracle數據庫服務器以增加內存分配已被排除,因爲它在整個團隊中使用並且至關重要。 這是一個簡單的選擇,在列上有一個過濾器。 我有什麼選擇使它工作?當嘗試分配X內存量時,sqlplus超出進程內存

1)將我的查詢分解爲多個塊並在夜間批處理模式下運行。 如果是這樣,一個選擇查詢如何分解 2)在大型表上使用sqlplus進行選擇查詢時,可以使用哪些優化技術? 3)任何基於java/ojdbc的解決方案可以將select分解爲塊並減少db服務器上的負載?

任何指針,非常感謝。

這裏是拋出的errror消息: ORA-04030:出處理存儲器的試圖分配169040個字節(PGA堆,KGH棧) ORA-04030時:嘗試分配16328個字節(KOH當出處理存儲器的-kghu sessi,pl/sql vc2)

+0

什麼是確切的錯誤信息和錯誤號碼? –

+0

「卸載」。這是爲了檔案目的嗎?會像數據泵一樣工作嗎? – DCookie

+0

這是一個夜間卸載到目標數據庫而不是存檔。 – urug

回答

1

ORA-4030表示進程需要更多內存(SGA/PGA中的UGA取決於服務器體系結構)來執行作業。

這可能是由於內存不足(專用服務器模式環境),一個小的PGA尺寸,或者可能是操作系統設置限制足夠的RAM的分配。

本MOS說明介紹如何診斷和解決ORA-04030錯誤。

診斷和解決ORA-4030錯誤(文檔ID 233869.1)

+0

我不認爲DBA會準備好干預oracle設置的默認值。我們知道如果默認值設置不足以滿足獲取1500萬條記錄的sqlplus客戶端應用程序的需求嗎?另外,我沒有看到關於任何基準測試的文章中的任何特定細節。 – urug

+0

這不是與SQLPLUS相關的問題。當您使用SQLPLUS連接到數據庫時,Oracle將創建一個服務器進程來滿足您的請求。服務器進程無法獲取從PGA分配的內存(由內存參數控制)。 – JSapkota

+0

我明白這一點。這就是爲什麼我說DBA可能沒有準備好更改在oracle服務器上設置的默認值,除非我使用一些關於oracle數據庫引發的過程觸發了多少memeory的數據,這些數據源自sqplplus客戶端執行的查詢將要執行的操作等等 – urug

0

你的選項1似乎在你的控制。分解查詢需要知道查詢/數據。數據中的一列可能工作;即

query1: select ... where col1 <= <value> 
query2: select ... where col1 > <value> 

......或......你可能需要圍繞這個問題構建更多的代碼。

想法:請問涉及排序/分組?你可以沒有它生活嗎?這些操作佔用更多的內存。