使用列表作为列会导致性能不佳 - JPA
Using lists as columns results in bad performance - JPA
我正在使用 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)
收集准备的目的是什么?可以跳过吗?
这是我的实体 class:
@Entity
public class Data {
@Id
private long id;
@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
@Column(columnDefinition = "TEXT", updatable = false)
private List<String> measurements;
急切加载任何集合可能会导致性能不佳。请注意,大多数持久性提供程序至少需要 N + 1 SELECT 到数据库来填充您的数据 - 第一个检索所有所有者实体加上一个 SELECT 用于每个需要填充的列表每个实体。如果您的要求可能,请在选择给定数据后删除预先获取并获取列表。
使用 TEXT 作为 columnDefinition 可能会产生很大的影响,因为某些数据库不是将数据保存在 普通列 中,而是将每个寄存器移动到自己的寄存器或文件中。如果可以,将您的列定义换成长度定义,这将使数据库能够更好地物理持久化您的数据并在之后修剪查询。
我正在使用 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)
收集准备的目的是什么?可以跳过吗? 这是我的实体 class:
@Entity
public class Data {
@Id
private long id;
@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
@Column(columnDefinition = "TEXT", updatable = false)
private List<String> measurements;
急切加载任何集合可能会导致性能不佳。请注意,大多数持久性提供程序至少需要 N + 1 SELECT 到数据库来填充您的数据 - 第一个检索所有所有者实体加上一个 SELECT 用于每个需要填充的列表每个实体。如果您的要求可能,请在选择给定数据后删除预先获取并获取列表。
使用 TEXT 作为 columnDefinition 可能会产生很大的影响,因为某些数据库不是将数据保存在 普通列 中,而是将每个寄存器移动到自己的寄存器或文件中。如果可以,将您的列定义换成长度定义,这将使数据库能够更好地物理持久化您的数据并在之后修剪查询。