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