2015-03-19 102 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實現支持)。