在Spring Boot中获取唯一aocDetailId:DISTINCT与Set哪个更高效?
在Spring Boot中获取唯一aocDetailId:选DISTINCT还是Set?
直接给结论:优先用代码块1的DISTINCT + List方案,原因如下:
核心区别
- 代码块1:让数据库在查询阶段就完成去重,返回的结果已经是唯一值,再用List接收(还能保留
ORDER BY的排序顺序)。 - 代码块2:数据库返回所有符合条件的ID(包括重复项),然后在应用内存里靠Set的特性自动去重,而且Set是无序的,你加的
ORDER BY完全起不到作用。
为什么DISTINCT更优?
- 减少数据传输:如果数据库里重复ID很多,DISTINCT能大幅削减返回给应用的数据量,既省带宽也减少应用端的内存开销。
- 数据库去重效率更高:数据库对这类去重操作有专门优化(比如利用索引),比在应用端把一堆重复数据塞进Set再去重的效率高得多。
- 保留排序逻辑:代码块2里的
ORDER BY是白费功夫,因为Set不保证元素顺序,而List可以完美保留数据库排序后的结果。
什么时候用Set?
只有当你不仅需要唯一ID,还得先拿到所有原始重复数据做其他处理时,才考虑用Set顺便去重。如果只是为了获取唯一的aocDetailId,完全没必要多此一举。
代码块1(推荐实现)
@Query(value = "SELECT DISTINCT a.aocDetailId FROM aocParsedDetail a WHERE a.dateCreated >= ?1 AND a.aocParsingStatus = ?2 ORDER BY a.dateCreated") List<String> findAocParsedDetailIdsOrderByDateCreated(@NotNull long dateCreated, EventStatus aocParsingStatus);
代码块2(仅特定场景适用)
@Query(value = "SELECT a.aocDetailId FROM aocParsedDetail a WHERE a.dateCreated >= ?1 AND a.aocParsingStatus = ?2 ORDER BY a.dateCreated") Set<String> findAocParsedDetailIdsOrderByDateCreated(@NotNull long dateCreated, EventStatus aocParsingStatus);
内容的提问来源于stack exchange,提问作者icenerd
相关产品推荐
相关产品推荐

