Java 使用SQL或作为集合对列表排序?

Java 使用SQL或作为集合对列表排序?,java,sql,jakarta-ee,collections,Java,Sql,Jakarta Ee,Collections,我的数据库中有一些带有日期的条目。什么是最好的 使用sql语句获取它们,并应用orderby 使用sql获取列表,并在应用程序中使用collection.sort对它们进行排序 感谢数据库管理系统(DMB)针对这些任务进行了优化,因此我认为您应该坚持使用它们。特别是如果您是从用PHP或(其他脚本语言)编写的脚本访问数据库,则使用脚本执行该任务可能会较慢。如果使用脚本对数组进行排序,也可能会达到PHP允许使用的内存限制 我不是要提出不同编程语言的性能问题,只是想指出,尽可能依赖DMB是一个非常

我的数据库中有一些带有日期的条目。什么是最好的

  • 使用sql语句获取它们,并应用
    orderby
  • 使用sql获取列表,并在应用程序中使用
    collection.sort
    对它们进行排序

感谢

数据库管理系统(DMB)针对这些任务进行了优化,因此我认为您应该坚持使用它们。特别是如果您是从用PHP或(其他脚本语言)编写的脚本访问数据库,则使用脚本执行该任务可能会较慢。如果使用脚本对数组进行排序,也可能会达到PHP允许使用的内存限制


我不是要提出不同编程语言的性能问题,只是想指出,尽可能依赖DMB是一个非常好的实践。

这是一个非常广泛的问题,很难回答,这在很大程度上取决于您所说的最佳

  • 从性能的角度来看,您只需测量以确定系统的哪个部分是瓶颈。数据库通常非常高效,但它仍然可能与客户机的卸载相关

  • 从一个角度来看,这取决于排序在应用程序中的重要性以及应用程序的分层方式


问问自己:“数据排序的知识属于哪里?”以及“如果我从关系数据库存储更改为其他存储,会发生什么情况”

在某种程度上,它取决于完整集合中有多少个值。如果是,比如说,20-30个值,那么您可以在任何地方进行排序-即使是相对较差的排序算法也可以很快做到这一点(尽管要避免;这很糟糕)-因为这是您可能期望在一个服务响应中实际获取的数据块的大小排序

但一旦进入更大的数据集,就需要更仔细地规划。特别是,如果不需要,您希望避免移动数据。如果数据当前只存在于数据库中,那么您真的不希望将其全部提取到客户机中只是为了对其进行排序(一个相对昂贵的操作),然后将其几乎全部丢弃。实际上,最好首先在数据库中对数据进行排序,这样按顺序提取数据就很简单了;在关系数据库术语中,保持数据排序在功能上与维护数据索引相同。事实上,您可以在数据上有多个索引,这可以使甚至相当复杂的查询变得快速。(NoSQL数据库更加多样化;有些甚至不支持保持数据分类的概念。)维护索引的缺点是它们占用更多的空间,而且需要时间来维护,尤其是在一开始创建数据时

因此,回到您的问题,您可能希望尽量不要对应用程序中的数据进行排序:对于大多数数据,适当的索引可以更有效,因为它使您的代码甚至不会查看不需要的数据。但是,如果您出于其他原因必须将其全部提取到应用程序中,并且无法将其预先排序,那么就没有理由避免自己对其进行排序:Java的排序算法是高效和稳定的。但是您应该测量以新的顺序从数据库中获取它是否更快。(问题是DB开销是否超过了重新排序的超线性成本;很多问题都在“可能;很难说”的领域。)


另一个需要平衡的问题是,代码本身不进行排序,而是始终将排序委托给DB是否更简单。保持你的代码更简单(并且更没有bug)是一个很好的目标…

这对我来说是一个非常有趣的问题,我想展示被接受答案的另一面,顺便说一句,这是一个非常好的答案,我不一定同意。只是想展示另一面。 当我开始我的职业生涯时,我在大型机DB2上工作,教我排序的老前辈们非常坚持在db之外进行排序。他们这样做的理由是,这是可以卸载的工作,这使得数据库可以自由地服务于其他请求。 当然,这远比这微妙得多。总的来说,我认为你所权衡的因素是: A) 您的数据库有多忙,或者是系统的中心?如果数据库非常繁忙,如果客户端或应用程序服务器上有大量OLTP处理,并且客户端或应用程序服务器上有大量过剩容量,为什么不在应用程序服务器或客户端上排序?即使效率较低,它也会将工作分散到整个系统中,并从整个系统的角度提高吞吐量。 B) 这一类有多大?比方说,因为您对数以百万计MB的数据进行了排序,所以破坏调用堆栈或java堆是愚蠢的。 C) 在应用程序或应用程序服务器中排序是否会导致暂停、延迟等?换句话说,如果您的特定编程语言具有非常糟糕的排序库,并且您不想编写自己的排序库,那么让数据库花费0.5秒可能比让应用程序花费5.0秒要好


所以,和所有事情一样,“这取决于”;-)。但是,我认为这是它所依赖的东西。

DB排序非常快。高度改进。我怀疑你能做得更好。@juergend只有在有索引的情况下才行。如果没有,DB在排序方面就没有任何优势。但是,如果在数据库中对其进行排序意味着您不必首先向客户机加载那么多数据,那么它可能仍然是一个成功的选择。但我大体上同意。我考虑在程序中排序的唯一情况是当用户重复排序时,对于一个不太大的结果。由于这需要太多的DBMS roundtripsAgree,如果是带有排序和过滤器等的UI网格/表,则需要@a_horse_和_no_名称,只要您得到