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

Jan*_*sch 2 java performance bulkinsert hsqldb

我有一个应用程序必须将大约1300万行大约10个平均长度的字符串插入到嵌入式HSQLDB中.我一直在调整东西(批量大小,单线程/多线程,缓存/非缓存表,MVCC事务,log_size/no日志,常规调用checkpoint,......),16核仍然需要7个小时,12 GB机器.

我之所以选择HSQLDB是因为我认为如果我把所有这些核心都用得很好,我可能会有很大的性能提升,但我真的开始怀疑我的决定.

有谁能告诉我银弹?

fre*_*edt 5

使用CACHED表,磁盘IO占用大部分时间.不需要多个线程,因为您要插入同一个表中.显着提高性能的一件事是重用单个参数化的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

更新:下面有1600万行的插入测试产生了1.9 GigaByte .data文件,并且在平均2核心处理器和7200 RPM磁盘上只花了几分钟.关键是大量的NIO分配.

connection time -- 47
complete setup time -- 78 ms
insert time for 16384000 rows -- 384610 ms -- 42598 tps
shutdown time  -- 38109 
Run Code Online (Sandbox Code Playgroud)