簡體   English   中英

為什么這個 TypedQuery 會導致執行速度很慢?

[英]Why does this TypedQuery result in a very slow execution?

我的代碼如下所示:

public Reservation findParametersToReport (Long external_id, Long client_id) {
String q = "Select r from Reservation r where r.client_id =:" + CLIENT_ID + "and external_id =:" + EXTERNAL_ID;

TypedQuery <Reservation> query = entityManager.createQuery (q, Reservation.class)
.setParameter (CLIENT_ID, client_id)
.setParameter (EXTERNAL_ID, external_id);

Reservation r = query.getSingleResult ();
return r;
}

它非常慢:大約 4 分鍾! 相同的數據庫查詢在 200 毫秒內完成

她站在最遠的地方:

Reservation r = query.getSingleResult ();

Reservation 實體只有一個 OneToMany 類型的引用(並且它是惰性的),而它有許多 BigDecimal 字段。 數據庫中的表本身也很大:它有 600 萬條記錄

我不知道可能是什么原因 - 我試圖只選擇我感興趣的字段(下面的查詢),這對我來說是最重要的 - 並且執行時間縮短了 ... 7 秒。

      public ReservationParamsDTO findParametersToReport (Long external_id, Long client_id) { 
//r.id - type Long, r.netAmount - type BigDecimal, r.date_of_arrival - type Date
    String q = "Select new com.example.dto.ReservationParamsDTO (r.id, r.netAmount, r.date_of_arrival) from Reservation r where r.client_id =:" + CLIENT_ID + "and external_id =:" + EXTERNAL_ID;
        
        TypedQuery <ReservationParamsDTO> query = entityManager.createQuery (q, ReservationParamsDTO .class) 
    .setParameter (CLIENT_ID, client_id) 
    .setParameter (EXTERNAL_ID, external_id);
        
        ReservationParamsDTO r = query.getSingleResult (); 
    return r; }

您能否向我提供一個提示,說明在這種情況下我應該從哪里開始尋求提高性能? 如果您需要更多信息,請告訴我。

您需要找出問題所在:在數據庫端或在您的應用程序中。
首先,啟用生成的 sql 查詢的日志記錄。
然后進行查詢之一並在您的數據庫上執行並解釋:

explain (analyze, buffers)
select ... -- your query here

你應該得到一個這樣的查詢計划:

Seq Scan on dict_product_catalog  (cost=0.00..9.28 rows=13 width=40) (actual time=0.043..0.046 rows=3 loops=1)
  Filter: (product_code = '5081'::bigint)
  Rows Removed by Filter: 3
  Buffers: shared hit=9
Planning:
  Buffers: shared hit=73
Planning Time: 0.367 ms
Execution Time: 0.092 ms

或者您可以按照前面評論中的建議設置 auto_explain 擴展。
如果查詢成本和執行時間沒問題,問題可能出在應用端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM