Java 8流vs jpa postrgresql orderby。性能更好的是什么?

时间:2015-09-11 08:18:09

标签: sql performance postgresql jpa java-8

我正在使用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())).

1 个答案:

答案 0 :(得分:1)

一般情况下,如果您可以使用SQL排序,请继续。如果您的排序列已编入索引,那么排序将是微不足道的:PostgreSQL将只读取已包含结果顺序的索引。即使您的排序列未编制索引,DBMS也可以更有效地执行此操作。例如,在DBMS内部排序期间没有必要将整行保存在内存中,只需要排序列和行ID中的值。获得正确排序的行ID列表后,您可以以流方式将行发送到客户端。另外,在对大表进行排序时,DBMS可能会将一些数据转储到硬盘上以减少内存使用量。

请注意,DBMS排序是在DBMS端执行的,它可以是完全不同的服务器,因此产生的速度还取决于DBMS服务器或应用程序服务器是否更强大或者现在有更多的免费资源。

如果您想用Java对结果进行排序,可能最好使用someCollection.sort(Comparator.comparing(e -> e.getSomeField()))进行就地排序(假设您的someCollectionList)。这将减少消耗的内存和数据复制的次数。就地排序对于ArrayList等基于数组的列表最有效。

还应注意,排序结果可能不同,因为它们可能取决于当前的DBMS排序规则(在Java中,您只需按UTF-16代码点值对字符串进行排序,除非使用自定义Collator)。