【问题标题】:Derby in-memory db: running out of memory on select into - statementsDerby in-memory db:select into - statements 时内存不足
【发布时间】: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。

有什么建议/想法吗?

问候, 迈克尔

【问题讨论】:

  • 您是否在单个事务中执行这些插入?

标签: java database jdbc derby


【解决方案1】:

您可以尝试通过模 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

并为每个插入提交事务。

【讨论】:

  • 把这些东西分块是个好主意。谢谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2023-03-31
  • 2015-12-23
相关资源
最近更新 更多