【问题标题】:Is there any way to load result query in memory?有没有办法在内存中加载结果查询?
【发布时间】:2011-10-15 22:49:07
【问题描述】:

我有一个庞大的数据库(21 亿行),我需要执行一些计算来提取一些统计结果。据我了解,直接在这个数据库上进行计算显然是不明智的。

我现在要做的是将表的一部分加载到内存中(比如 100 万行)。我不确定如何在不逐行迭代的情况下将 ResultSet 的整个数据块加载到内存中。

有什么想法吗?

【问题讨论】:

  • To my understanding, it's obvious that it is not wise to perform the calculation directly on this database. 取决于计算。
  • 我同意 Jacob 的观点:你的理解是错误的。这正是关系 DBMS 要做的事情。

标签: java database large-data


【解决方案1】:

显然直接在这个数据库上进行计算是不明智的

相反,在数据库中进行操作很可能是最明智的方法。数据库的构建正是为了处理大量数据。如果您可以将计算表达为 SQL 查询,那么数据库将计算出如何有效地执行它。一般来说,它会比您将所有数据加载到内存中并自己处理要快得多。

有些计算并非如此 - 例如图形分析 - 但它应该是您的默认方法。

【讨论】:

  • 完全同意,数据库通常可以更好地处理数据操作。在大多数情况下,在数据库中预先计算然后仅查询结果是大多数情况下的最佳方法。
【解决方案2】:

为什么在迭代结果集时遇到问题?如果您希望以更大的块检索实际数据(例如,为了防止网络往返数据库),您可以设置结果集的 fetch size 以提示 JDBC 驱动程序检索更大部分的数据。

【讨论】:

    【解决方案3】:

    我同意以前的答案,即在内存中加载这么多数量可能不好。 但回答你的问题,ResultSet 的断开表示有类:javax.sql.RowSet

    【讨论】:

    • 断开连接并不能解决中间层所有 RAM 的问题。
    【解决方案4】:

    将数百万行从数据库移动到中间层,只是为了进行可以在数据库上完成的计算,对我来说完全没有意义。您应该考虑在数据库上执行此操作。制作原型,看看数据是否能说服你放弃偏见。

    【讨论】:

    • 好的,我会更具体地介绍数据,我有一个日期字段。我需要在一周中的几天和一天中的几个小时运行一些统计数据。例如星期一有百万条记录等。我想我可以在较小的部分和多个线程上运行此统计信息。最后,我会将所有结果汇总在一起。
    【解决方案5】:

    你想做的事叫做OLAP (Online Analytical Processing)。许多 RDBMS 为此类功能提供了丰富的特性集,精确地用于计算东西,例如 Oracle 分析函数。如果无法在单个 SQL 查询中完成计算,您可以编写存储过程来为您完成这项工作。

    但是请 - 不要从某些数据库中加载 TB 的数据,只需执行一些可以直接在数据存储中完成的计算即可。为什么?您将 99% 的时间用于数据加载和传输,1% 用于计算。

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2015-07-19
      • 2020-09-16
      • 1970-01-01
      相关资源
      最近更新 更多