【发布时间】:2010-09-15 23:18:20
【问题描述】:
我想将我的结果集(大约 150 万行)中的“随机”输出以排序方式放入文件中。我知道我可以在查询中使用按命令排序,但该命令是“昂贵的”。 你能告诉我是否有任何算法可以在文件中写入结果集行,以便最终对内容进行排序,我可以通过这个获得性能吗? 我使用的是 java 1.6,查询有多个连接。
【问题讨论】:
标签: java file sorting resultset
我想将我的结果集(大约 150 万行)中的“随机”输出以排序方式放入文件中。我知道我可以在查询中使用按命令排序,但该命令是“昂贵的”。 你能告诉我是否有任何算法可以在文件中写入结果集行,以便最终对内容进行排序,我可以通过这个获得性能吗? 我使用的是 java 1.6,查询有多个连接。
【问题讨论】:
标签: java file sorting resultset
为表中的排序条件定义一个索引,然后您就可以毫无问题地使用 order by 子句,并将文件从结果集中写入。
如果您的查询有多个连接,请为连接和排序条件创建适当的索引。您可以对程序中的数据进行排序,但您会浪费时间。学习如何正确调整/使用数据库而不是重新发明数据库引擎中已经存在的排序算法时,这段时间将更有价值。
获取数据库的分析器并检查查询的执行计划。
【讨论】:
根据我的经验,在数据库端排序通常一样快或更快......当然,如果您排序的列被索引
【讨论】:
如果您正在从数据库中读取数据,那么如果您有适当的索引,那么获取已排序的输出不应该那么“昂贵”。
但是,有时对于复杂的查询,SQL 优化器很难应用索引。在这种情况下,数据库只是将结果累积到一个临时表中,然后透明地为您排序。
您的数据库引擎中的优化级别不太可能匹配;但是,如果您的问题是因为您正在对数据进行一些后处理而否定数据库所做的任何排序,那么您别无选择,只能自己排序。
同样,最简单的方法是使用数据库:只需写入具有适当索引的临时表并从那里转储。
如果您确定数据将始终适合 RAM,则可以在内存中对其进行排序。这是您可能能够击败数据库引擎的唯一情况,只是因为您知道自己不需要高清访问权限。
但这是很多“如果”。更好地留在你的数据库中
【讨论】:
如果您需要对数据进行排序,则必须有人来做——您或数据库。将 ORDER BY 添加到查询中当然更容易。但是没有理由不能在内存中对它进行排序。最简单的方法是使用 Comparator 对排序集合(TreeSet、TreeMap)中的数据进行分块,以便对所需的列进行排序。然后写出排序后的数据。
【讨论】: