2011-12-14 95 views
4

我不得不在項目中使用一些大表的Derby。爲了獲得一些性能,我從三個不同的表格中選擇文檔ID到一個巨大的表格中以查找文檔類型。Derby內存中的db:在select into語句中內存不足

基本上是一個非常簡單的查詢:

"INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT" 
"INSERT INTO DOC_TYPES SELECT DOC_ID, 2 FROM TYPE_B_DOCUMENT" 
"INSERT INTO DOC_TYPES SELECT DOC_ID, 3 FROM TYPE_C_DOCUMENT" 

當我在「正常」模式運行這個,我的硬盤上的德比戰,它需要大約1分鐘來處理,我結束了約6.5億在數據庫行(巨大,我知道...)

無論如何,數據庫仍然是我的口味慢,所以我試圖在內存中運行的一切。不幸的是,即使有4GB的堆大小(我硬盤上的完整數據庫從未超過1GB),在「java/lang/OutOfMemoryError」中操作結果相當快。

我真的沒有看到任何替代方案或解決方法來解決這個問題。 Derby不支持實體化視圖並且在Java中執行此操作(SELECT,interate resultset,INSERT)會花費幾個小時...

由於Derby似乎不支持「聲音塊」限制。

任何建議/想法?

問候, 邁克爾

+0

您是否在單個事務中執行這些插入操作? – stacker 2011-12-14 15:32:28

回答

3

你可以嘗試通過模ID創建塊,模操作的第二值設置爲塊的數量(n),你需要。並重複比較0 ..(n-1)

INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT WHERE DOC_ID % 2 = 0 
INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT WHERE DOC_ID % 2 = 1 

並提交每個插入事務。

+1

這是一個非常好的想法,可以將這些東西組合起來。謝謝 ;) – Michael 2011-12-14 17:40:16