[英]How to optimize the JPA query
我的代码存在瓶颈,但无法优化查询。 零件表有一百万条记录,执行此方法需要一分钟多的时间。 关于如何重写此查询以使执行在几秒钟内发生的任何建议?
log.info("Starting Part Map...");
Map<String, List<Part>> exPartsByPartNumber = partRepo.findAll().stream()
.collect(Collectors.groupingBy(Part::getPartNumber));
log.info("mapped existing parts by pn");
PartBase.java
@SuppressWarnings("serial")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder(toBuilder = true)
//@Entity
@Audited(withModifiedFlag = true)
@MappedSuperclass
public class PartBase extends AuditEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PART_ID")
private Integer partId;
@Column(name = "part_number")
private String partNumber;
@Column(name = "part_description")
private String partDescription;
@JsonIgnore
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ESN_ID", nullable = false)
private Esn esn;
@Column(name = "quantity")
private String quantity;
......}
您的方法可能很慢的一个原因是因为它正在对实体的每个记录/实例的内存副本进行操作。 findAll()
只返回一个List<>
,这意味着它基本上是在做一个没有WHERE
或GROUP BY
的SELECT * FROM table
。 您在该List
上调用stream()
,但到那时所有记录都被拉入 memory ,然后内存中的 stream 与分组Collector
一起进行collect()
。 换句话说,在这里使用 stream 并不能真正帮助您提高性能。
相反,您可以构造一些东西,以便数据库进行分组; 它可能会更快,因为这是 DB 擅长的。 这是在 Spring JPA 存储库中进行聚合(分组)的各种技术的教程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.