我正在使用jpa entitymenager和postgresql以及java 8。 我需要按名称显示一些数据顺序。
什么是更快,更好的表现:
对数据库进行查询,如
@Query("select t from Table t order by t.someField ")
或者只是从数据库中获取所有记录并使用java 8 stream api对其进行排序,如
someCollection.stream().sorted((e1, e2) -> e1.getSomeField()
.compareTo(e2.getSomeField())).
答案 0 :(得分:1)
一般情况下,如果您可以使用SQL排序,请继续。如果您的排序列已编入索引,那么排序将是微不足道的:PostgreSQL将只读取已包含结果顺序的索引。即使您的排序列未编制索引,DBMS也可以更有效地执行此操作。例如,在DBMS内部排序期间没有必要将整行保存在内存中,只需要排序列和行ID中的值。获得正确排序的行ID列表后,您可以以流方式将行发送到客户端。另外,在对大表进行排序时,DBMS可能会将一些数据转储到硬盘上以减少内存使用量。
请注意,DBMS排序是在DBMS端执行的,它可以是完全不同的服务器,因此产生的速度还取决于DBMS服务器或应用程序服务器是否更强大或者现在有更多的免费资源。
如果您想用Java对结果进行排序,可能最好使用someCollection.sort(Comparator.comparing(e -> e.getSomeField()))
进行就地排序(假设您的someCollection
是List
)。这将减少消耗的内存和数据复制的次数。就地排序对于ArrayList
等基于数组的列表最有效。
还应注意,排序结果可能不同,因为它们可能取决于当前的DBMS排序规则(在Java中,您只需按UTF-16代码点值对字符串进行排序,除非使用自定义Collator
)。