繁体   English   中英

如何优化 JPA 查询

[英]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<> ,这意味着它基本上是在做一个没有WHEREGROUP BYSELECT * FROM table 您在该List上调用stream() ,但到那时所有记录都被拉入 memory ,然后内存中的 stream 与分组Collector一起进行collect() 换句话说,在这里使用 stream 并不能真正帮助您提高性能。

相反,您可以构造一些东西,以便数据库进行分组; 它可能会更快,因为这是 DB 擅长的。 这是在 Spring JPA 存储库中进行聚合(分组)的各种技术的教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM