2014-11-15 23 views
0

在批處理應用程序中,我使用臨時基於文件的H2數據庫來存儲3M行。數據庫大小爲9GB。如何使H2返回結果更快,以獲得大的結果集?

在批處理結束時,我將數據庫的內容導出到換行符分隔的JSON文件。這基本上是一個大的休眠JOIN查詢,然後迭代結果集寫入生成的文件。產生的文件大小約爲5GB。

執行JOIN查詢獲取對象大約需要6分鐘。我可以優化這個,但對我來說還是可以的。

我的問題是,從複製到報告文件的下一個操作是非常緩慢的。完成需要30分鐘。對VisualVM的CPU採樣器進行快速檢查表明,大部分時間都用於org.h2.store.WriterThread.run()org.h2.store.fs.FileDisk.read()

enter image description here

由此我明白什麼需要大部分時間都是被寫在結果緩衝器H2結果在硬盤上保存,並從中讀取。由於結果集相當大,我不能將其存儲在內存中。我的其他選項可以使此操作更快運行?

注意:爲確保磁盤性能(它是Google Compute Engine上的SSD磁盤)不對此負責,我使用cp命令將9GB數據庫備份到另一個文件,並花了5分鐘時間。

回答

0

對你得到的結果的一些解釋:WriterThread的CPU時間爲0,因爲它大部分時間都在等待(休眠)。 FileDisk.read可能正在讀取數據庫文件,或從大型結果集中讀取(在H2中,在大多數情況下,大型結果集將寫入磁盤)。所以目前還不清楚問題是否真的是一個臨時結果集創建的。

要分析性能瓶頸,我要做的是分析最頻繁的堆棧跟蹤。這將顯示它緩慢的地方和原因。現在,所有你看到的都是緩慢的,但不是爲什麼(其他方法稱之爲)。

如果問題確實是臨時結果集存儲在磁盤上,那麼我知道的唯一解決方案就是避免使用較大的結果集。