我有了插入约13万行的约10的平均长度字符串在嵌入式HSQLDB的应用程序。 我已经调整的事情(批量大小,单线程/多线程,缓存/无缓存表,MVCC交易,LOG_SIZE /无日志,定期调用checkpoint
,...),它仍然需要7小时16核心, 12 GB机。
我选择了HSQLDB,因为我想如果我把所有这些内核,以良好的使用,但我认真地开始怀疑我的决定,我可能有一个显着的性能增益。
谁能告诉我银弹?
我有了插入约13万行的约10的平均长度字符串在嵌入式HSQLDB的应用程序。 我已经调整的事情(批量大小,单线程/多线程,缓存/无缓存表,MVCC交易,LOG_SIZE /无日志,定期调用checkpoint
,...),它仍然需要7小时16核心, 12 GB机。
我选择了HSQLDB,因为我想如果我把所有这些内核,以良好的使用,但我认真地开始怀疑我的决定,我可能有一个显着的性能增益。
谁能告诉我银弹?
使用缓存表,磁盘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
检查你的应用程序在做。 第一件事是看资源利用率在任务管理器(或特定OS相媲美)和VisualVM的。
对于造成了不良的性能不错的候选人:
H2Database可能会给你稍微好一点的性能比HSQLDB(同时保持语法兼容)。
在任何情况下,你可能会想用更高的延迟同步到磁盘,以降低随机存取磁盘I / O尝试。 (即SET WRITE_DELAY <num>
希望你做批量INSERT
语句,而不是每行一个插件。 如果没有,这样做,如果可能的。
根据您的应用需求,你可能是一个key-value存储比RDBMS更好。 (你经常需要插入1.3 * 10 ^ 7项?)
你的主要限制因素将是随机存取操作盘。 我高度怀疑,任何你正在做的将是CPU绑定。 (看看top
,然后把它比作iotop
!)
有了这么多的记录,也许你可以考虑切换到的NoSQL数据库。 这取决于你需要存储,当然,数据的性质/格式。