2014-11-15 38 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中,在大多数情况下,大型结果集将写入磁盘)。所以目前还不清楚问题是否真的是一个临时结果集创建的。

要分析性能瓶颈,我要做的是分析最频繁的堆栈跟踪。这将显示它缓慢的地方和原因。现在,所有你看到的都是缓慢的,但不是为什么(其他方法称之为)。

如果问题确实是临时结果集存储在磁盘上,那么我知道的唯一解决方案就是避免使用较大的结果集。