【发布时间】:2012-01-20 09:08:10
【问题描述】:
我必须在项目中使用带有一些大桌子的德比。为了获得一些性能,我从三个不同的表中选择文档 ID 到一个大表中以查找文档类型。
基本上是一个非常简单的查询:
"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 分钟来处理,我最终在数据库中有大约 650 万行(巨大,我知道...)
无论如何,数据库对于我的口味来说仍然很慢,所以我试图在内存中运行所有内容。不幸的是,即使堆大小为 4GB(我的硬盘驱动器上的完整 DB 从未超过 1GB),操作结果很快就会出现“java/lang/OutOfMemoryError”。
我真的没有看到任何替代方案或解决方法来解决这个问题。 Derby 不支持物化视图,并且在 Java 中执行此操作(SELECT、interate resultset、INSERT)需要几个小时...
您也不能“分块”声明,因为 Derby 似乎不支持 LIMIT。
有什么建议/想法吗?
问候, 迈克尔
【问题讨论】:
-
您是否在单个事务中执行这些插入?