2011-07-29 66 views
0

我有一個龐大的數據庫(21億行),我需要執行一些計算來提取一些統計結果。就我的理解而言,顯然直接在這個數據庫上執行計算並不明智。有什麼辦法可以在內存中加載結果查詢嗎?

我現在要做的是將表的一部分加載到內存中(稱爲100萬行)。我不知道如何將ResultSet的整個數據塊加載到內存中,而無需逐行迭代。

有什麼想法?

+5

'據我的理解,很顯然,直接在這個數據庫上執行計算是不明智的.'取決於計算。 – Jacob

+0

我同意雅各布:你的理解是錯誤的。這正是關係數據庫管理系統的意圖。 –

回答

7

很明顯,這不是明智的做法是直接在此數據庫

相反上進行計算,則很可能在數據庫做,就做最明智的方式。數據庫的建立正是爲了處理大量的數據。如果您可以將您的計算表達爲SQL查詢,那麼數據庫將解決如何高效執行它。一般來說,這比將所有數據加載到內存並自己處理它快得多。

有些情況並非如此 - 例如圖分析 - 但它應該是您的默認方法。

+0

完全同意,數據處理通常通過數據庫更好地處理。在大多數情況下,在數據庫中進行預先計算,然後查詢結果是大多數情況下的最佳方法。 – jasalguero

0

爲什麼在迭代結果集時遇到問題?如果您希望以更大的塊來檢索實際數據(例如,爲了防止網絡往返數據庫),您可以設置結果集的提取大小以提示JDBC驅動程序檢索大部分數據。

0

我同意以前的答案,它可能是不好的加載在內存中的這種數額。 但回答你的問題,有類的ResultSet斷開表示:javax.sql.RowSet

+0

斷開連接並不能解決中間層上所有RAM的問題。 – duffymo

0

移動數百萬行的從數據庫到中間層,只是爲了做到這一點可以在數據庫上進行計算,是沒有意義的我在所有。你應該考慮在數據庫上這樣做。原型,看看數據是否說服你放棄你的偏見。

+0

好吧我會更具體的數據,我有一個日期字段。我需要在一週中的幾天和一天中的幾個小時內運行一些統計數據。例如週一有百萬條記錄等。我想我可以在較小的部分和多線程上運行這些統計數據。最後我會彙總所有結果。 –

0

你想要做什麼叫做OLAP (Online Analytical Processing)。許多RDBMS爲這種功能提供了豐富的功能集,用於計算內容,例如Oracle解析函數。如果計算無法在單個SQL查詢中完成,則可以編寫存儲過程爲您完成這項工作。

但是,請不要從某些數據庫加載太字節的數據只做一些可以直接在數據存儲中完成的計算。爲什麼? 99%的時間用於數據加載和傳輸,1%用於計算。

相關問題