的HyperSQL(HSQLDB):大量插入性能(HyperSQL (HSQLDB): massiv

2019-07-29 03:17发布

我有了插入约13万行的约10的平均长度字符串在嵌入式HSQLDB的应用程序。 我已经调整的事情(批量大小,单线程/多线程,缓存/无缓存表,MVCC交易,LOG_SIZE /无日志,定期调用checkpoint ,...),它仍然需要7小时16核心, 12 GB机。

我选择了HSQLDB,因为我想如果我把所有这些内核,以良好的使用,但我认真地开始怀疑我的决定,我可能有一个显着的性能增益。

谁能告诉我银弹?

Answer 1:

使用缓存表,磁盘IO正在采取的大部分时间。 没有必要对多线程,因为你是插入到相同的表。 这noticably提高性能的一件事是一个参数化PreparedStatment的重用,设置参数的每一行插入。

在你的机器,你可以通过使用内存映射IO大NIO限制显著提高IO。 例如SET FILES NIO SIZE 8192 。 一个64位的JVM需要更大的尺寸以具有的效果。

http://hsqldb.org/doc/2.0/guide/management-chapt.html

为了减少IO的批量插入使用期限SET FILES LOG FALSE ,直到插入结束不执行检查点。 细节在这里讨论:

http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#dec_bulk_operations

UPDATE:低于1600万行产生了1.9千兆字节。数据文件和插入测试用了短短几分钟的平均2核处理器和7200转的硬盘上。 最关键的是大NIO分配。

connection time -- 47
complete setup time -- 78 ms
insert time for 16384000 rows -- 384610 ms -- 42598 tps
shutdown time  -- 38109 


Answer 2:

检查你的应用程序在做。 第一件事是看资源利用率在任务管理器(或特定OS相媲美)和VisualVM的。

对于造成了不良的性能不错的候选人:

  • 磁盘IO
  • 垃圾收集器


Answer 3:

H2Database可能会给你稍微好一点的性能比HSQLDB(同时保持语法兼容)。

在任何情况下,你可能会想用更高的延迟同步到磁盘,以降低随机存取磁盘I / O尝试。 (即SET WRITE_DELAY <num>

希望你做批量INSERT语句,而不是每行一个插件。 如果没有,这样做,如果可能的。

根据您的应用需求,你可能是一个key-value存储比RDBMS更好。 (你经常需要插入1.3 * 10 ^ 7项?)

你的主要限制因素将是随机存取操作盘。 我高度怀疑,任何你正在做的将是CPU绑定。 (看看top ,然后把它比作iotop !)



Answer 4:

有了这么多的记录,也许你可以考虑切换到的NoSQL数据库。 这取决于你需要存储,当然,数据的性质/格式。



文章来源: HyperSQL (HSQLDB): massive insert performance