我有一个相当复杂的数据库查询,它提供了 3000 万条记录 - 大约是内存中数据量的 15 倍。我需要按顺序访问数据库中的所有记录(即排序)。出于性能原因,不可能使用“order by”语句,因为有序 ResultSet
的准备大约需要 40 分钟。
我看到两种可能的选择来解决我的问题:
将结果数据转储到无序文件中,并使用某种形式的合并排序来获得已排序的文件
展平数据并将其转储到辅助数据库中,并使用数据库的排序机制重新选择它。
出于优雅和性能的原因,您更喜欢哪一个?
如果您选择第二个,您对要使用的数据库有什么建议吗?您更喜欢 SQLite、MySQL 还是 Apache Derby?
最佳答案
要对大量数据进行排序,一种解决方案是将它们排序为可以加载的数据 block 。例如第 30 个 (15 * 2) 并对这些记录进行排序。这将为您提供 30 个已排序的文件。
获取 30 个已排序的文件并在它们之间进行合并排序。 (这需要内存中至少 30 条记录)您可以在排序时处理它们。
顺便说一句:现在也可能是时候购买一台功能更强大的计算机了。您可以花费近 1000 美元购买一台配备 16 GB 内存和 SSD 的 PC。只需 2000 美元,您就可以获得一台具有 32 GB 内存的快速 PC。这可以节省您很多时间。 ;)
关于java - 归并排序还是数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9437561/