在DB中对数据进行排序的优缺点?

时间:2010-05-17 11:43:57

标签: java database performance hibernate sorting

假设我有一个包含VARCHAR类型字段的表。我需要从该表中按字母顺序对该表中的数据进行排序。

最佳方法(性能)是什么:将order by field添加到SQL查询中,或者在数据已被提取时对其进行排序?

我正在使用Java(使用Hibernate),但我无法告诉任何有关数据库引擎的信息。它可以是任何流行的关系数据库(如MySQL或MS Sql Server或Oracle或HSQL DB或任何其他)。

表中的记录数量可能差别很大,但我们假设有5k记录。

UPD:第二级休眠缓存(例如EHCache)如何支持排序数据?

8 个答案:

答案 0 :(得分:9)

如果对此字段编制索引,则此任务中的平均DB将比Java更有效。另请注意,如果是纯显示,通常不会一次检索所有这些行,而是检索它的一个子集,以便可以通过分页显示。您也可以在DB级别执行此操作。用Java对数据进行排序需要将整个表拖到Java的内存中,你不想这样做。


在Hibernate中,您可以使用Criteria#addOrder()订阅结果,并使用Criteria#setFirstResult()Criteria#setMaxResults()分页。 E.g。

List users = session.createCriteria(User.class)
    .addOrder(Order.asc("username"))
    .setFirstResult(0) // Index of first row to be retrieved.
    .setMaxResults(10) // Amount of rows to be retrieved.
    .list();

答案 1 :(得分:5)

对数据库中的数据进行排序 - 这是(它的一部分)它的用途。数据库引擎可能比你更好地排序这些数据。

答案 2 :(得分:2)

数据库中的专业排序:

  1. 速度。如果你有一个按条件排序的索引,那么databasae根本不需要排序,为了获得最大性能,你可以使用聚集索引。
  2. 易于使用。 sql查询中的order by比Java Comparator更容易编写和维护。
  3. 在应用程序中进行专业排序:

    1. 可定制性。也许你想按更复杂的标准排序,然后Java中的自定义排序会更灵活。
    2. 重复性。如果您为不同的数据库编码,他们的Collating rules可能会有所不同。也许这是一个问题,你想要一个特别的odering。在Java中,您可以编写Custom Collator以确保以相同的方式对所有数据库的输出进行排序。

答案 3 :(得分:1)

  

最佳方法(性能)是什么:在SQL查询中按字段添加排序或在数据已被提取时对其进行排序?

它是ORDER BY,而不是排序。

这是一个权衡问题:客户端的分类是分布式的,这意味着对服务器的影响较小。但是,它可能需要更多客户端资源。

如果字段未编入索引,要返回整个已排序的记录集,服务器将需要执行以下操作:

  1. 获取整个记录集
  2. 排序
  3. 通过网络将其发送给客户
  4. ,虽然在客户端排序只需要点13(资源密集程度最低)。

    如果您的服务器需要同时为数百个客户端提供服务而您的客户端需要整个记录集,那么很可能在客户端进行排序会更有效。

    如果字段已编制索引,则数据库可以返回已从该索引排序的数据。但是,这将需要额外的表查找来获取其他字段。

    此外,如果您不想要整个记录集但只需要一些顶级字段(例如ORDER BY LIMITSELECT TOP … ORDER BY),则不需要通过网络获取和传输整个记录集。在这种情况下,数据库端的排序可能会更有效。

答案 4 :(得分:0)

我的解决方案是使用order by子句创建排序列的索引和写入查询。

答案 5 :(得分:0)

只有5千条记录,它并没有太大的区别,但我会把它归类为数据库;即使场上没有索引,也可能至少与之后的索引一样快。

答案 6 :(得分:0)

  • 您通常只提取该数据的子集吗? - >良好的后端设计(索引和/或分区)可帮助您更快地提取订购的子集;然后db上的“order by”就是瞬间问题。
  • 表总是包含几行数据?然后db上的“order by”就是瞬间问题

即使你没有(不能)优化你的数据库,你也应该(几乎)总是喜欢将这种op.s留给b.e.

答案 7 :(得分:0)

如果您愿意将所有数据存入内存并在内存中使用它,那么这个库将非常适合您的用例

http://casperdatasets.googlecode.com

它像内存表一样有效地运行,并允许您对内存(以及java)中的数据执行搜索,过滤和排序。它对于您尝试使用的记录数量执行速度非常快,并且您不需要与繁重的ORM框架集成。