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

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

  • 使用sql语句获取它们并按order by应用。
  • 获取带有sql的列表,并使用collection.sort左右在应用程序中对它们进行排序?

谢谢

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

但是一旦你进入更大的数据集,你需要更仔细地计划。 特别是,如果不必要,您希望避免移动数据。 如果数据当前只存在于数据库中,那么你真的不想将它全部提取到客户端只是为了对它进行排序(一个相对昂贵的操作),然后几乎扔掉所有数据。 实际上保持数据在数据库中排序开始要好得多,因此按顺序拾取数据是微不足道的; 在关系数据库术语中,保持数据排序在function上与维护数据索引相同。 实际上,您可以在数据上使用多个索引,这样可以快速进行相当复杂的查询。 (NoSQL DB更加多样化;有些甚至不支持保持数据排序的概念。)维护索引的缺点是它们占用更多空间并且需要时间来维护,特别是在第一次创建数据时地点。

所以…回到你的问题,你可能想尝试不对应用程序中的数据进行排序:对于大多数数据,适当的索引可以更高效,因为它让你的代码甚至不会查看不需要的数据 。 但是如果由于某些其他原因你必须将它全部提取到你的应用程序中并且你不能将它带入预先排序的,那么就没有理由避免自己对它进行排序:Java的排序算法是高效和稳定的。 但是您应该测量是否更快地从数据库中获取它。 (问题是数据库开销是否超过了重新排序的超线性成本;许多问题出现在“可能;难以分辨”的答案中。)

要平衡的另一件事是代码是否更容易对自己进行排序,而是始终将其委托给数据库。 保持代码更简单(更无错误)是一个很好的目标…

这是一个非常广泛的问题,很难回答,而且很大程度上取决于你的最佳意思?

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

  • 从关注点分离的角度来看,它取决于排序在应用程序中的重要性以及应用程序的分层方式。

问问你自己: “数据排序的知识属于哪里?” 并且“如果我从关系数据库存储更改为不同的东西,将会发生什么 ”。

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

我并不是要提出不同编程语言的性能问题,只是想指出尽可能依赖DMBS是一种非常好的做法。

这对我来说是一个非常有趣的问题,我想提出接受答案的另一面,BTW是一个非常好的答案,我不一定*不同意。 只是想呈现另一面。 当我开始职业生涯时,我正在研究大型机DB2,而那些教我的老人是非常坚持的,那就是在db的外面完成排序。 他们的理由是可以卸载它的工作,这使得DB可以自由地为其他请求提供服务。 当然,它比这更微妙。 一般来说,我会说你正在权衡的因素是:A)你的系统的繁忙程度或核心是你的数据库? 如果您的数据库非常繁忙,如果您在客户端或应用服务器上进行了大量OLTP处理,并且您的客户端或应用服务器具有大量过剩容量,为什么不在应用服务器或客户端上进行排序? 即使效率较低,它也会通过系统传播工作,从整个系统的角度为您提供更高的吞吐量。 B)那种有多大? 比如说,吹掉你的调用堆栈或java堆是愚蠢的,因为你排序了数千亿MB的数据。 C)您的应用程序或应用程序服务器中的排序会导致暂停,延迟等吗? 换句话说,如果你的特定编程语言真的有错误的排序库,并且你不想编写自己的编程语言,那么让数据库花费0.5秒比使你的应用程序花费5.0秒更好。

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