如何优化JPQ JOIN查询以更快地运行

时间:2015-03-19 02:42:48

标签: java sql performance hibernate jpa

我的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条记录太慢了!还有其他解决方法吗?

1 个答案:

答案 0 :(得分:6)

  1. 尝试仅将SELECT子句限制为TaskRunner并使用显式JOIN:

    SELECT tr 
    FROM TaskResult tr 
    JOIN tr.task t
    JOIN t.user u
    WHERE u.id = :id
    
  2. 转动所有EAGER associations into LAZY ones并在查询的基础上使用FETCH。

  3. 确保所有外键(Task.task_runner_idUser.task_id)的索引

  4. 尝试运行SQL查询,看看它是否也会变慢。如果SQL很慢,那么Hibernate就不会更快。

  5. 尝试从TaskRunner中选择较少的列并改为使用投影。

  6. 你说有10,000行,但你肯定不需要在UI中显示那么多实体。尝试使用比默认OFFSET分页更好扩展的keyset pagination(大多数JPA实现都支持)。