java - 归并排序还是数据库?

标签 java performance comparison mergesort

我有一个相当复杂的数据库查询,它提供了 3000 万条记录 - 大约是内存中数据量的 15 倍。我需要按顺序访问数据库中的所有记录(即排序)。出于性能原因,不可能使用“order by”语句,因为有序 ResultSet 的准备大约需要 40 分钟。

我看到两种可能的选择来解决我的问题:

  1. 将结果数据转储到无序文件中,并使用某种形式的合并排序来获得已排序的文件

  2. 展平数据并将其转储到辅助数据库中,并使用数据库的排序机制重新选择它。

出于优雅和性能的原因,您更喜欢哪一个?

如果您选择第二个,您对要使用的数据库有什么建议吗?您更喜欢 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/

相关文章:

java - Cypher 挂起,我们如何修复/重新设计?

MySQL : Outer Join Query : Some alternate better approach (overriding field value by other table's field value only if available)

python - 如何在 if/else 子句中正确使用 != 符号?

php - 将字符串与 mysql 中的值进行比较

java - Java WebApp 中的 CAC 身份验证

java - 如果一个分区受到限制,如何对 kafka 中的剩余分区应用循环法

java - 如何确保消息到达Kafka Broker?

Java 定时器帮助?

Python:最有效的递归输出方法是什么?

linux - 如何在 shell 脚本中比较两个浮点值