2015-03-19 78 views
3

我的JPA应用程序中存在性能问题。假设我有3个实体:如何优化JPQ JOIN查询以加快运行速度

class TaskResult { 
    Task task; 
} 

class Task { 
    User user; 
} 

class User { 
    Long id; 
} 

现在,我想所有TaskResults的列表中一个特定的用户id,有查询将是这样的:

SELECT * FROM TaskResult r WHERE r.task.user.id = :id 

而且超过10000条记录它的速度太慢!有没有其他解决方法?

+0

这是JPA的方式,在我的项目中,我在'database'中创建'view',并且将这个视图绑定为只读的'Entity'。它会获得更好的表现... – CycDemo 2015-03-19 03:56:03

回答

5
  1. 尝试仅仅限制SELECT子句TaskRunner并用明确连接:

    SELECT tr 
    FROM TaskResult tr 
    JOIN tr.task t 
    JOIN t.user u 
    WHERE u.id = :id 
    
  2. 打开所有EAGER associations into LAZY ones和使用获取一个查询的基础上。

  3. 确保有所有的外键(Task.task_runner_idUser.task_id)指数

  4. 尝试运行SQL查询的看看它的慢了。如果SQL很慢,那么Hibernate无法获得更快的速度。

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

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