2017-07-26 45 views
1

我在我的代碼中使用JPQL構造函數。它涉及很大的結果,5024數據檢索和執行此查詢時創建的對象。完成執行需要大約2分鐘的時間。有多個表涉及執行此查詢。因爲數據庫數據每天都會更新,所以我無法緩存。有什麼方法可以優化執行速度嗎?JPQL構造函數執行需要很長時間

我的SQL查詢的形成是這樣的,

String sql = "SELECT DISTINCT " 
        + "new com.abc.dc.entity.market.LaptopData(vd.segment.id, vd.segment.segmentGroup, " 
        + "vd.segment.segmentName, vd.segment.category, " 
        + "vd.product.make, vd.product.model, vd.product.modelYear) " 
        + "FROM LaptopData vd, Profile p " 
        + "WHERE vd.profile.profileCode = :profileCode " 
        + "AND vd.pk.profileId = p.id " 
        + "Order By vd.segment.segmentGroup, vd.segment.segmentName, vd.product.make, vd.product.model," 
        + " vd.product.modelYear asc"; 
Query query = em.createQuery(sql); 
query.setParameter("profileCode", profileCode); 

@SuppressWarnings("unchecked") 
List<LaptopData> results = query.getResultList(); 

em.clear(); 
return results; 
+0

看着執行的生成的SQL?和時間花在哪裏? –

回答

0

嗯,你一個選擇是創建單獨的表,該表將包含該查詢所有實體的結果和日常(每天晚上)更新它,然後當您生成新表

"SELECT DISTINCT" 
       + "new com.abc.dc.entity.market.LaptopData(m.id, m.segmentGroup, " 
       + "m.segmentName, m.category, " 
       + "m.make, m.model, m.modelYear) " 
       + "FROM someNewTable m" 
       + "WHERE m.profileCode = :profileCode "; 

這樣你就不必做加盟,訂貨每次執行查詢的時間,但一天只有一次:在這個新表運行查詢,像這樣。當然,用這種方法來查看數據更新,你必須等到新表被重新創建。

此外,您可以在其中子句中使用的字段上創建索引。

+0

但是在這裏我沒有發現任何時間延遲檢索數據。但我想時間會因對象創建而增加。我不確定使用JPQL構造函數的屏幕背後發生了什麼。但是對於每個獲取的行對象的聲音都是立即創建的。是否有任何解決方法來加速對象創建? – velraj

+0

你測試過了嗎?你有沒有任何分析器輸出?您無法解決對象創建問題,並且它在java中速度非常快。我認爲這種情況下大多數性能很重的操作是**按**語句排序。 – Max

+1

是的,沒錯。問題不在於創建對象。即使當我使用本地查詢來獲取它也需要很長時間。 – velraj

相關問題