Derby内存中db:select into - 语句内存不足

时间:2011-12-14 15:27:13

标签: java database jdbc derby

我必须在项目中使用带有一些大表的derby。为了获得一些性能,我将从三个不同的表中选择文档ID到一个巨大的表中,以便查找doc类型。

基本上是一个非常简单的查询:

"INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT"
"INSERT INTO DOC_TYPES SELECT DOC_ID, 2 FROM TYPE_B_DOCUMENT"
"INSERT INTO DOC_TYPES SELECT DOC_ID, 3 FROM TYPE_C_DOCUMENT"

当我在“正常”模式下运行时,在我的硬盘驱动器上使用derby,处理大约需要1分钟,最后我在DB中有大约650万行(很大,我知道......)< / p>

无论如何,数据库仍然可以减慢我的口味,所以我试图在内存中运行所有内容。不幸的是,即使有4GB的堆大小(我的硬盘驱动器上的完整数据库永远不会超过1GB),在“java / lang / OutOfMemoryError”中操作结果也相当快。

我真的没有看到任何替代方案或变通方法来解决这个问题。 Derby不支持物化视图,在Java中执行此操作(SELECT,interate resultset,INSERT)需要数小时......

你也不能“大肆宣传”这句话,因为德比似乎不支持LIMIT。

有任何建议/想法吗?

此致 迈克尔

1 个答案:

答案 0 :(得分:3)

您可以尝试通过modulo id创建块,将模运算的第二个值设置为您需要的块数(n)。并从0 ..(n-1)

重复比较
INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT WHERE DOC_ID % 2 = 0
INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT WHERE DOC_ID % 2 = 1

并为每个插入提交事务。