【问题标题】:Using lists as columns results in bad performance - JPA使用列表作为列会导致性能不佳 - JPA
【发布时间】:2020-07-26 07:06:28
【问题描述】:

我正在使用 hibernate,我注意到当使用列表作为列时,使用 JpaRepository 从数据库 (findById) 获取需要很长时间。在日志中我发现查询是正确的:

select
    measuremen0_.data_id as dat1_3_0_,
    measuremen0_.measurements as measurem2_3_0_,
    measuremen0_.measurements_order as measurem3_0_ 
from
    data_measurements measuremen0_ 
where
    measuremen0_.data_id=?

但是在查询之后有一个初始化需要很多时间,甚至比查询本身还要移动:

Preparing collection initializer:
Found row of collection:
Found row of collection:
Found row of collection:
... (times number of measurements)

收集准备的目的是什么?可以跳过吗? 这是我的实体类:

@Entity
public class Data {

@Id
private long id;

@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
@Column(columnDefinition = "TEXT", updatable = false)
private List<String> measurements;

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa hibernate-mapping


    【解决方案1】:

    急切地加载任何集合都可能导致性能下降。请注意,大多数持久性提供程序至少需要 N + 1 SELECT 到数据库来填充您的数据 - 第一个检索所有所有者实体加上需要填充到每个实体中的每个列表的一个 SELECT。如果您的要求可能,请在选择给定数据后删除急切获取并获取列表。

    使用TEXT 作为columnDefinition 可能会产生很大的影响,因为某些数据库不会将数据保存在普通列 中,而是将每个寄存器移动到自己的寄存器或文件中。如果可以的话,将列定义换成长度定义,这将使数据库能够更好地保留您的数据并在之后修剪查询。

    【讨论】:

    • 我尝试将集合定义为惰性集合,并使用 join-fetch 查询来获取它,这提供了完全相同的性能。我会尝试使用不同的列类型,谢谢
    • JOIN FETCH 策略应该提供完全相同的性能,因为急切加载等同于连接提取。
    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2012-07-31
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多