我有一个巨大的数据库(21 亿行),我需要执行一些计算来提取一些统计结果。据我了解,直接在这个数据库上进行计算显然是不明智的。
我现在要做的是将表的一部分加载到内存中(比如 100 万行)。我不确定如何在不逐行迭代的情况下将 ResultSet 的整个数据块加载到内存中。
任何想法?
我有一个巨大的数据库(21 亿行),我需要执行一些计算来提取一些统计结果。据我了解,直接在这个数据库上进行计算显然是不明智的。
我现在要做的是将表的一部分加载到内存中(比如 100 万行)。我不确定如何在不逐行迭代的情况下将 ResultSet 的整个数据块加载到内存中。
任何想法?
很明显,直接在这个数据库上进行计算是不明智的
相反,很可能在数据库中做它是最明智的做法。数据库的构建正是为了处理大量数据。如果您可以将计算表达为 SQL 查询,那么数据库将计算出如何有效地执行它。一般来说,它会比将所有数据加载到内存并自己处理要快得多。
有一些计算不是这种情况——例如图形分析——但它应该是你的默认方法。
为什么迭代结果集有问题?如果您希望以更大的块检索实际数据(例如,为了防止网络往返数据库),您可以设置结果集的获取大小以提示 JDBC 驱动程序检索更大部分的数据。
我同意以前的答案,即在内存中加载这样的数量可能不好。但是回答你的问题,有一个不连接表示的类ResultSet
:javax.sql.RowSet
将数百万行从数据库移动到中间层,只是为了进行可以在数据库上完成的计算,对我来说根本没有意义。您应该考虑在数据库上执行此操作。制作原型,看看数据是否能说服你放弃偏见。
您要做的就是所谓的OLAP(在线分析处理)。许多 RDBMS 为此类功能提供了丰富的特性集,精确地用于计算内容,例如 Oracle 分析函数。如果无法在单个 SQL 查询中完成计算,您可以编写存储过程来为您完成这项工作。
但是请 - 不要从某些数据库中加载 TB 的数据,只需做一些可以直接在数据存储中完成的计算。为什么?您将 99% 的时间用于数据加载和传输,1% 用于计算。