0

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

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

任何想法?

4

5 回答 5

7

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

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

有一些计算不是这种情况——例如图形分析——但它应该是你的默认方法。

于 2011-07-29T13:03:20.513 回答
0

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

于 2011-07-29T13:05:30.090 回答
0

我同意以前的答案,即在内存中加载这样的数量可能不好。但是回答你的问题,有一个不连接表示的类ResultSetjavax.sql.RowSet

于 2011-07-29T13:10:07.460 回答
0

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

于 2011-07-29T13:11:53.900 回答
0

您要做的就是所谓的OLAP(在线分析处理)。许多 RDBMS 为此类功能提供了丰富的特性集,精确地用于计算内容,例如 Oracle 分析函数。如果无法在单个 SQL 查询中完成计算,您可以编写存储过程来为您完成这项工作。

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

于 2011-07-30T16:13:32.610 回答