【问题标题】:H2 Database - Creating IndexesH2 数据库 - 创建索引
【发布时间】:2013-01-31 01:55:44
【问题描述】:

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

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

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

在加载表格时我不能使用 MVCC 模式,因为稍后我在进行选择时需要使用 MULTI_THREADED 模式。当我尝试使用 MULTI_THREADED 模式时,即使我将数据加载到离散表中,也会出现锁定错误。

非常感谢!

【问题讨论】:

  • 为什么不照常加载数据并创建索引?
  • 创建索引需要很长时间,所以我正在寻找一种跨线程分配时间的方法。目前,由于锁定问题,我正在按顺序执行所有操作,但我会在下面尝试 Thomas 的建议。
  • 我明白,但我不确定很多线程会改进。如果你有统计数据,我很感兴趣..
  • 我刚试过,它似乎确实提高了性能。我加载了大约 2000 万条记录,过去需要 15 分钟,现在需要 10 分钟。我首先创建内存表、链接表(指向 mySQL)和索引,然后使用线程,使用 INSERT INTO memoryTable(xxx) SELECT xxx FROM linkedTable 将链接表数据插入到内存表中。我也在使用这个连接字符串:jdbc:h2:mem:ingestion;DB_CLOSE_DELAY=-1;MULTI_THREADED=1;LOG=0;UNDO_LOG=0;

标签: java database h2


【解决方案1】:

另一种显着改善 H2 加载,尤其是索引性能的方法是将初始内存设置为接近预期的内存要求。举个例子,这一更改允许一个大约 1.5GB 要求的应用程序在 47 秒内启动,而不是在 15 到 20 分钟后失败。在此之前,我们看到超过 GC Overhead limit 和 JVMTI 错误。

将以下内容添加到您的 VM 参数中(作为示例):

 -Xms2g
 -Xmx4g

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 非常感谢 - 我会尝试的!另外,感谢您创建了如此出色的软件 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多