2013-02-15 2033 views
2

我正在使用H2数据库 - 以嵌入模式运行 - 当我的应用程序启动时,我使用mySQL数据库中的数据加载H2数据库。我使用链接表来指向mySQL表。H2数据库 - 创建索引

我的问题是,我试图加快H2在表上创建索引的时间,特别是对于较大的表(500万+)。

有谁知道是否可以安全地在单独的线程中运行CREATE INDEX命令,同时我将下一个表的数据加载到H2中? 例如: 线程1:负载表1 - >告诉线程2开始创建索引,然后线程1个负载表2等

我不能,因为我后来加载表时使用MVCC模式当我做我的选择时需要使用MULTI_THREADED模式。当我尝试使用MULTI_THREADED模式时,即使我正在将数据加载到离散表中,我也会收到锁定错误。

非常感谢!

+0

为什么不加载数据和“正常”后创建索引? – twillouer 2013-02-15 17:02:39

+0

创建索引需要很长时间,所以我正在寻找一种方法来分配跨线程的时间。目前,我正在做所有事情,因为锁定问题,但我会尝试Thomas的建议。 – joechip 2013-02-15 18:06:43

+0

我明白了,但我不确定比许多线程会改善。如果你有统计资料,我会接受采访。 – twillouer 2013-02-15 21:25:37

回答

2

什么可能工作(但我不知道它是否更快)是先创建表和索引,然后并行加载表。这应该避免系统表中的锁定问题。

+0

非常感谢 - 我会尽力的!另外,感谢您创建这样一个惊人的软件:) – joechip 2013-02-15 15:49:20

0

我还想添加rst.findColumn(“columnName”)方法来查找获取表结果集后的索引。 rst是一个ResultSet对象。这是我用过的。

0

的另一种方式显着改善H2加载和特别是索引性能是将初始内存设置接近预期的内存要求。举一个例子,这个改变允许一个约1.5GB的应用程序在47秒内启动,而不是在15-20分钟后失败。在此之前,我们看到GC开销超出限制和JVMTI错误。

以下内容添加到您的VM参数(作为一个例子):

-Xms2g 
-Xmx4g