簡體   English   中英

首次執行時慢速休眠查詢

[英]Slow Hibernate query on first execution

我有一個(非常)復雜的應用程序,該應用程序將GET-Request轉換為對Oracle DB的許多Hibernate查詢。

它基本上檢索分散在約100個表中的對象的屬性。

即使對於極端情況(=大結果集),我也必須減少最大請求時間。

在邊緣情況下,第一次調用時(即經過一段時間后),性能會非常慢。 之后,即使我同時刷新了緩沖區高速緩存和共享池,查詢也要快得多。

這適用於SAME GET-Request,即請求的同一對象。 請求另一個對象,但是相同的屬性再次在第一次調用上花費很長時間。


例如,相同的查詢,相同的條件,提取的總行數(低)成千上萬:

  • 第一次通話:26.000ms
  • 刷新緩沖區高速緩存/共享池后的第一次調用:2800ms
  • 刷新后的第二次通話:1200ms

通過研究網絡,我已經發現刷新池並不一定要真正刷新池,因此我不能依靠它。

需要說明的是,我是一名開發人員,並且對Oracle具有良好的工作知識,但是我不是DBA,也沒有訪問完整DBA的權限。


我懷疑以下原因導致執行速度緩慢:

  • Oracle進行了很長時間的硬解析(執行的查詢可能包含數千個參數):我無法找出“不良”硬解析可能需要多長時間。 企業管理器告訴我,盡管我對多次執行的查詢只進行了1次硬解析,所以似乎不太可能。

  • 查詢本身會花費很長時間,但是會被緩存並且我的操作不會清空緩存(也許是磁盤緩存嗎?):同樣,企業管理器不同意並且總體上顯示出非常短的查詢時間。

  • 起初我確實懷疑Hibernate / Java的原因(畢竟要創建很多對象),但是由於性能上的巨大差異,這似乎不太可能

我對如何進行性能調整一無所知,並且正在尋找有用的閱讀材料和/或關於為什么第一次執行如此緩慢的不同想法。

第一個查詢通常比Oracle DB中的任何后續查詢花費更多的時間。

在這種情況下,僅依靠Oracle緩存似乎不是一個好習慣。 但是,如果您首先可以通過執行一個虛擬對象來模仿查詢(也許是在應用程序啟動之后),那可能會很方便。 這可能有助於減少任何后續相等調用的執行時間。

盡管這種解決方案可能有助於提高性能,但更可靠的方法是在應用程序級別引入程序化緩存。 它可以用於重復獲取的實體或任何其他非持久對象。

請注意,如果問題的范圍僅限於數據庫,則它是Database Administrators Stack Exchange上問題的理想選擇。

暫無
暫無

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

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