在批处理应用程序中,我使用临时基于文件的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分钟时间。