2

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

我之所以选择 HSQLDB,是因为我认为如果我充分利用所有这些内核,我可能会获得可观的性能提升,但我开始怀疑我的决定。

谁能告诉我银弹?

4

4 回答 4

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 
于 2012-04-24T08:12:08.600 回答
1

检查您的应用程序在做什么。首先要做的是查看 taskmanager(或特定于操作系统的可比性)和 visualvm 中的资源利用率。

导致表现不佳的好人选:

  • 磁盘 IO
  • 垃圾收集器
于 2012-04-24T07:29:16.523 回答
1

H2Database可能会为您提供比 HSQLDB 稍好的性能(同时保持语法兼容性)。

在任何情况下,您都可能希望尝试使用更高的延迟来同步到磁盘以减少随机访问磁盘 I/O。(即。SET WRITE_DELAY <num>

希望您正在执行批量INSERT语句,而不是每行插入一次。如果没有,请尽可能这样做。

根据您的应用程序要求,使用键值存储可能比使用 RDBMS 更好。(您是否经常需要插入 1.3*10^7 个条目?)

您的主要限制因素将是对磁盘的随机访问操作。我非常怀疑您所做的任何事情都会受 CPU 限制。(看看top,然后比较它iotop!)

于 2012-04-24T07:39:13.383 回答
0

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

于 2012-04-24T07:48:38.033 回答