在批處理應用程序中,我使用臨時基於文件的H2數據庫來存儲3M行。數據庫大小爲9GB。如何使H2返回結果更快,以獲得大的結果集?
在批處理結束時,我將數據庫的內容導出到換行符分隔的JSON文件。這基本上是一個大的休眠JOIN
查詢,然後迭代結果集寫入生成的文件。產生的文件大小約爲5GB。
執行JOIN
查詢獲取對象大約需要6分鐘。我可以優化這個,但對我來說還是可以的。
我的問題是,從複製到報告文件的下一個操作是非常緩慢的。完成需要30分鐘。對VisualVM的CPU採樣器進行快速檢查表明,大部分時間都用於org.h2.store.WriterThread.run()
和org.h2.store.fs.FileDisk.read()
。
由此我明白什麼需要大部分時間都是被寫在結果緩衝器H2結果在硬盤上保存,並從中讀取。由於結果集相當大,我不能將其存儲在內存中。我的其他選項可以使此操作更快運行?
注意:爲確保磁盤性能(它是Google Compute Engine上的SSD磁盤)不對此負責,我使用cp
命令將9GB數據庫備份到另一個文件,並花了5分鐘時間。