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

mem*_*und 13 java sql collections java-ee

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

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

谢谢

And*_*ahl 10

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

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

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

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


Don*_*ows 4

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

\n\n

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

\n\n

所以\xe2\x80\xa6 回到你的问题,你可能想尝试不对应用程序中的数据进行排序:对于大多数数据,适当的索引可以更有效,因为它让你的代码甚至不查看不需要的数据。但是,如果您出于其他原因必须将其全部提取到应用程序中并且无法将其预先排序,则没有理由避免自己对其进行排序:Java 的排序算法高效且稳定。但是您应该衡量以新顺序从数据库中获取它是否更快。(问题是数据库开销是否超过了重新排序的超线性成本;很多问题都在 \xe2\x80\x9c 可能的领域中;很难说 \xe2\x80\x9d 就是答案。)

\n\n

另一件需要平衡的事情是,对于您的代码来说,不进行排序本身而始终将其委托给数据库是否更简单。保持代码更简单(并且更无错误)是一个很好的目标\xe2\x80\xa6

\n