将结果集按排序输出到文件

3
我希望将结果集(约1.5百万行)中的“随机”输出以排序方式存入文件。我知道可以在查询中使用sort by命令,但该命令很“昂贵”。请问是否有算法可以将结果集行写入文件,以便最终内容排序,并且我能从中获得更好的性能?我正在使用Java 1.6,查询具有多个连接。
4个回答

5
为您的表中的排序条件定义一个索引,然后您可以无问题地使用order by子句并将文件写成结果集。如果您的查询有多个连接,请为连接和排序条件创建适当的索引。您可以在程序中对数据进行排序,但这将浪费时间。将这些时间用于学习如何正确调整/使用数据库比重新发明已经存在于数据库引擎中的排序算法更有价值。获取您的数据库分析器并检查查询的执行计划。

1
在我的经验中,数据库端的排序通常是同样快或更快的...尤其是当你所排序的列被索引时。

0

如果你从数据库中读取数据,如果你有适当的索引,获取排序输出不应该是那么“昂贵”的。

但是,有时候对于复杂的查询,SQL优化器很难应用索引。在这种情况下,数据库会简单地将结果累积到一个临时表中,并为您透明地进行排序。

很少有可能你能够匹配到你的数据库引擎所做的优化水平;但是,如果你的问题是因为你正在对数据进行一些后处理,使得数据库所做的任何排序都被抵消了,那么你别无选择,只能自己进行排序。

同样,最简单的方法是使用数据库:只需编写一个带有适当索引的临时表并从其中转储即可。

如果你确定数据总是适合内存,你可以在内存中对其进行排序。这是唯一一种情况,你可能能够击败数据库引擎,因为你知道你不需要访问硬盘。

但这有很多“如果”。最好还是使用你的数据库。


请注意,这里的“可能”是强调语气。因为如果数据适合内存,数据库也知道(或可以被告知),那么你就回到了原点。 - Vinko Vrsalovic

0
如果您需要排序的数据,那么必须有人来完成这项工作 - 不管是您还是数据库。将 ORDER BY 添加到查询中肯定更容易。但是您也可以在内存中对其进行排序。最简单的方法是使用 Comparator 将数据分块存储在已排序的集合(TreeSet、TreeMap)中,以便按所需列进行排序。然后输出已排序的数据。

没有什么理由阻止你这样做,但从性能方面考虑,除非你有非常特殊的情况(数据适合内存,非常奇怪的数据库模式导致无法修复查询计划),否则你确实不应该这样做。 - Vinko Vrsalovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接