我試圖檢測和優化Java/Hibernate應用程序內的低效連接。我注意到,在某些情況下,由於結果集中連接的處理方式,導線數據流的效率非常低。如何使用hibernate跟蹤結果集大小?
讓我舉個例子。假設你有一個HQL查詢,看起來像這樣:
select s from Store s
left join fetch s.items i
left join fetch s.employees e
left join fetch s.customers c
where s.id = :id
(忽略了片刻,這是不是一個聰明的查詢 - 它只是一個簡單的例子)。
如果您想象某商店有1000件商品,10名員工和100位客戶,那麼您將得到一個帶有1111個實體的java對象樹。這可能讓你想到從數據庫返回大約1111行,而實際上結果集有1,000,000行!
所有列的存在使情況變得更糟。如果你想象每個表格有5列,你可能會想象你回來了大約5555個「項目」,而結果集中的單元格數(行*列)實際上是20,000,000。
顯然,應用程序開發人員有責任瞭解此問題,而不是以這種方式編寫查詢。但是,這有時會發生無意(以不太嚴重的方式),並且能夠以某種方式識別這些情況來對應用程序進行測試將是非常好的。
但是,我一直無法找到任何計算方法(從Java/Hibernate應用程序中)計算原始結果集中的行數或列數。 Hibernate攔截器,Hibernate事件或Hibernate統計信息都不能訪問這些信息。
有什麼建議嗎?提前致謝。
以及你可以總是使用相同的查詢,但計數(*)之前執行此:) – Apostolos
是的,這將工作,代價(可能)的每個查詢的執行時間加倍,所以它肯定是不完美的解決方案:) –
can not query.list()。size()給出記錄的取數? –