我撰寫了這個 SQL 查詢并將其用作休眠中的本機查詢。
@Query(
value = "SELECT DISTINCT tp.* FROM TWITTER_POST AS tp "
"JOIN TWITTER_LIST AS tl "
"ON tl.owner_id = ?1 "
"JOIN REL_TWITTER_LIST__ACCOUNTS_TRACKED_BY_LIST AS atbl "
"ON tl.id = atbl.twitter_list_id "
"JOIN TWITTER_ACCOUNT AS ta "
"ON ta.id = atbl.accounts_tracked_by_list_id "
"LEFT OUTER JOIN REL_TWITTER_POST__TWITTER_USERS_HIDING_POST uhp "
"ON tp.id = uhp.twitter_post_id "
"AND uhp.TWITTER_USERS_HIDING_POST_ID = ?1 "
"WHERE uhp.twitter_post_id is NULL AND ta.id = tp.author_id",
countQuery = "SELECT DISTINCT count(tp.*) FROM TWITTER_POST AS tp "
"JOIN TWITTER_LIST AS tl "
"ON tl.owner_id = ?1 "
"JOIN REL_TWITTER_LIST__ACCOUNTS_TRACKED_BY_LIST AS atbl "
"ON tl.id = atbl.twitter_list_id "
"JOIN TWITTER_ACCOUNT AS ta "
"ON ta.id = atbl.accounts_tracked_by_list_id "
"LEFT OUTER JOIN REL_TWITTER_POST__TWITTER_USERS_HIDING_POST uhp "
"ON tp.id = uhp.twitter_post_id "
"AND uhp.TWITTER_USERS_HIDING_POST_ID = ?1 "
"WHERE uhp.twitter_post_id is NULL AND ta.id = tp.author_id",
nativeQuery = true
)
Page<TwitterPost> findAllNonHiddenForListsFromTwitterAccountId(Long twitterAccountId, Pageable pageable);
我注意到當我通過休眠而不是 SQL 工具運行查詢時,查詢的執行速度非常慢。我認為這是因為我使用的是本機查詢而不是 JQPL,它(從我讀到的內容)立即進行快取和分頁,而無需定義“計數”。嘗試將其轉換為 JQPL 失敗了,因為我找不到關于跨連接表對 JQPL 進行更復雜查詢的好的教程。
@Query(
value = "SELECT DISTINCT twitterPost "
"FROM TwitterPost twitterPost "
"JOIN TwitterList twitterList "
"ON twitterList.owner.id = ?1 "
"JOIN TwitterAccount tweetAuthorFromList "
"ON tweetAuthorFromList IN twitterList.accountsTrackedByLists "
"WHERE twitterPost.author = tweetAuthorFromList "
"AND twitterList.owner NOT IN twitterPost.twitterUsersHidingPosts"
)
Page<TwitterPost> findAllNonHiddenPostsFromListsForTwitterAccountId(Long twitterAccountId, Pageable pageable);
顯然我的語法已關閉
org.hibernate.exception.SQLGrammarException: 無法準備陳述句
但是編譯器只向我顯示生成的 SQL 的問題,而不是 JQPL,所以我被蒙在鼓里。
還檢查了典型的性能不佳的罪魁禍首,即急切地獲取我在任何地方都設定為懶惰的物體。
非常感謝有關我的性能問題假設是否正確或轉換查詢的任何幫助 - 提前致謝!
uj5u.com熱心網友回復:
這里有很多錯誤的地方:
- 將 SELECT DISTINCT 與 JOIN 一起使用表示您應該改用半連接。
- 這
ON tl.owner_id = ?1是為了過濾,而不是為了投影,因此你最好做一個 EXISTS 查詢。 - 假設為什么查詢運行緩慢而不是對其進行分析。在DB工具中運行速度更快的原因是DB工具通常會截斷結果集,而Spring Data則消耗整個結果集。或者,如果您運行
EXPLAIN,則輸出可能來自優化器,甚至沒有運行查詢。
因此,您可以執行以下操作:
- 使用 Semi Joins 而不是 Joins 進行過濾。
- 用于
Blaze Persistence動態撰寫更好的物體查詢。 - 在 JDBC 驅動程式級別配置陳述句快取。
- 當查詢慢于 N 秒時,使用慢查詢日志記錄執行計劃。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/355777.html
