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

use*_*877 3 java sql performance hibernate jpa

我的JPA应用程序中存在很大的性能问题.假设我有3个实体:

class TaskResult {
    Task task;
}

class Task {
    User user;
}

class User {
    Long id;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想得到一个特定userId的所有TaskResults的列表,那里的查询将是这样的:

SELECT * FROM TaskResult r WHERE r.task.user.id = :id
Run Code Online (Sandbox Code Playgroud)

超过10000条记录太慢了!还有其他解决方法吗?

Vla*_*cea 6

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

    SELECT tr 
    FROM TaskResult tr 
    JOIN tr.task t
    JOIN t.user u
    WHERE u.id = :id
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将所有EAGER关联转换为LAZY关联,并在查询的基础上使用FETCH.

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

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

  5. 尝试从中选择较少的列,TaskRunner然后使用投影.

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