【问题标题】:search resultset by column按列搜索结果集
【发布时间】:2012-12-13 14:13:56
【问题描述】:

我对大型数据库的结果集有疑问。 (MySQLDB,Java 1.7)

任务是将一列的所有条目转换为另一个数据库。 (例如,将每个数字除以三,然后将它们写入另一个数据库)

由于数据库包含大约 70 列和几百万行,我的第一个方法是获取 SELECT * 并按列解析结果集。

不幸的是,我发现无法以这种方式解析它,因为指定的方式打算逐行遍历它(while(rs.next()) {} 等)。

我不喜欢这种方式,因为它会创建 70 个大数组,我每次只有一个来减少内存使用。

以下是我的主要问题:

  1. 有什么办法吗?
  2. 我应该为每一列创建一个查询并解析它们(一次一个数组,但有 70 个查询)还是
  3. 我应该只获取整个 ResultSet 并逐行解析,然后将它们写入 70 个数组吗?

提前问候和感谢!

【问题讨论】:

  • 你的意思是other database还是other table
  • 相关吗?但你是对的,它实际上只是另一张桌子
  • 非常相关,因为如果只是另一个表,你可以使用数据库来完成这项工作。这将非常高效,您根本不需要任何 java 代码(除非您希望 java 执行 sql 语句)。

标签: java mysql resultset


【解决方案1】:

为什么不只是 page your queries ?一次拉出 'n' 行,执行转换,然后将它们写入新数据库。

这意味着您不会在一次查询/迭代中提取所有内容,然后一次性编写全部内容,并且您不会遇到逐行工作的低效率。

我的其他评论可能是过早的优化。您是否尝试过加载整个数据集,并查看需要多少内存。如果它是 10 甚至 100 兆的数量级,我希望 JVM 能够轻松处理。

我假设您的转换需要在 Java 中完成。如果您可以在 SQL 中执行此操作,那么完全在数据库中执行此操作可能会更加高效。

【讨论】:

  • 我并不担心结果集的大小,而是 70 个数组的大小(我认为它必须小于结果集)。但是您的方法提出了很多查询,这会导致更高的流量。现在我不确定哪个资源是瓶颈(流量或内存)
  • 我的方法建议可调整数量的查询。如果您分页,那么您可以选择页面的大小(例如 500 行?),以便加载给定数量的数据,然后在一个批处理操作中将每个集合写回。更改页面大小决定 a) 每个查询消耗的内存量 b) 回写到 db 的次数
【解决方案2】:

你为什么不只用mysql来做呢。

使用这个查询:

create table <table_name> as select <column_name_on_which_you_want_transformation>/3 from <table name>;

【讨论】:

  • 因为“/3”只是一个例子,而转换要复杂得多……我想过,但不确定是否可行。不过,我会再试一次
  • 好的..如果您仍然遇到任何问题,请告诉我们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2012-08-03
相关资源
最近更新 更多