我必须在项目中使用带有一些大表的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。
有任何建议/想法吗?
此致 迈克尔
答案 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
并为每个插入提交事务。