【发布时间】: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;