我的JPA应用程序中存在很大的性能问题。假设我有3个实体:
class TaskResult {
Task task;
}
class Task {
User user;
}
class User {
Long id;
}
现在,我想获取一个特定userId的所有TaskResults的列表,查询将类似于:
SELECT * FROM TaskResult r WHERE r.task.user.id = :id
超过10000条记录太慢了!还有其他解决方法吗?
答案 0 :(得分:6)
尝试仅将SELECT子句限制为TaskRunner并使用显式JOIN:
SELECT tr
FROM TaskResult tr
JOIN tr.task t
JOIN t.user u
WHERE u.id = :id
转动所有EAGER associations into LAZY ones并在查询的基础上使用FETCH。
确保所有外键(Task.task_runner_id
和User.task_id
)的索引
尝试运行SQL查询,看看它是否也会变慢。如果SQL很慢,那么Hibernate就不会更快。
尝试从TaskRunner
中选择较少的列并改为使用投影。
你说有10,000行,但你肯定不需要在UI中显示那么多实体。尝试使用比默认OFFSET分页更好扩展的keyset pagination(大多数JPA实现都支持)。