假设我有一个包含VARCHAR类型字段的表。我需要从该表中按字母顺序对该表中的数据进行排序。
最佳方法(性能)是什么:将order by field
添加到SQL查询中,或者在数据已被提取时对其进行排序?
我正在使用Java(使用Hibernate),但我无法告诉任何有关数据库引擎的信息。它可以是任何流行的关系数据库(如MySQL或MS Sql Server或Oracle或HSQL DB或任何其他)。
表中的记录数量可能差别很大,但我们假设有5k记录。
UPD:第二级休眠缓存(例如EHCache)如何支持排序数据?
答案 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)
数据库中的专业排序:
order by
比Java Comparator更容易编写和维护。在应用程序中进行专业排序:
答案 3 :(得分:1)
最佳方法(性能)是什么:在SQL查询中按字段添加排序或在数据已被提取时对其进行排序?
它是ORDER BY
,而不是排序。
这是一个权衡问题:客户端的分类是分布式的,这意味着对服务器的影响较小。但是,它可能需要更多客户端资源。
如果字段未编入索引,要返回整个已排序的记录集,服务器将需要执行以下操作:
,虽然在客户端排序只需要点1
和3
(资源密集程度最低)。
如果您的服务器需要同时为数百个客户端提供服务而您的客户端需要整个记录集,那么很可能在客户端进行排序会更有效。
如果字段已编制索引,则数据库可以返回已从该索引排序的数据。但是,这将需要额外的表查找来获取其他字段。
此外,如果您不想要整个记录集但只需要一些顶级字段(例如ORDER BY LIMIT
或SELECT TOP … ORDER BY
),则不需要通过网络获取和传输整个记录集。在这种情况下,数据库端的排序可能会更有效。
答案 4 :(得分:0)
我的解决方案是使用order by子句创建排序列的索引和写入查询。
答案 5 :(得分:0)
只有5千条记录,它并没有太大的区别,但我会把它归类为数据库;即使场上没有索引,也可能至少与之后的索引一样快。
答案 6 :(得分:0)
即使你没有(不能)优化你的数据库,你也应该(几乎)总是喜欢将这种op.s留给b.e.
答案 7 :(得分:0)
如果您愿意将所有数据存入内存并在内存中使用它,那么这个库将非常适合您的用例
http://casperdatasets.googlecode.com
它像内存表一样有效地运行,并允许您对内存(以及java)中的数据执行搜索,过滤和排序。它对于您尝试使用的记录数量执行速度非常快,并且您不需要与繁重的ORM框架集成。