簡體   English   中英

DB 查詢速度快,但 JPARepository 獲取速度慢

[英]Query on DB is fast, but fetching by JPARepository is slow

我在數據庫中有以下表格:

Person , Parent , GrandParent Parent - PersonOneToMany關系( PersonparentIdGrandParent - ParentManyToMany關系( grandparent_parent表)

我在擴展JPARepository PersonRepository中創建:

@Query("SELECT person.uuid FROM Person person JOIN person.parent parent JOIN parent.grandparents grandparent WHERE grandparent.uuid = ?1")
Set<String> findByGrandParentId(final String parentId);

用於獲取在給定GrandParent下的Person所有 id。 創建此 SQL:

SELECT
   person0_.uuid as col_0_0_ 
FROM
    person person0_ 
INNER JOIN
    parent parent1_ 
        on person0_.parentid=parent1_.uuid 
INNER JOIN
    grandparent_parent grandaparent_parent2_ 
        on parent1_.uuid=grandaparent_parent2_.parentid 
INNER JOIN
    grandparent parent3_ 
        on grandaparent_parent2_.grandparentid=parent3_.uuid 
WHERE
    parent3_.uuid='13906f55-441c-45bd-bef6-8beefa4119c4'

我登錄庫需要多少時間獲取數據,並花了(平均)〜400ms的獲取〜400分的記錄。 然后我在 DB 上執行相同的 SQL 查詢,每次查詢花費的時間不超過50ms

我知道這個生成的查詢沒有優化,因為我們只能連接兩個表GRANDPARENT_PARENTPERSON ,但這不是這里的問題,因為這樣的查詢也在50ms以下執行。

為什么我在通過存儲庫獲取和在數據庫中獲取之間有如此大的差異? 有沒有可能解決這個問題?

多種可能性:

1. 生成的查詢

生成的查詢對我來說看起來很不錯。 它與@Query注釋中的查詢@Query

2. SQL Result 到 Java Object 的轉換

我不知道您的表有多大,但是:將 SQL 結果轉換為 Java 對象需要一些時間。 對於小表,這可能會增加 0-5% 的查詢時間。

3. 懶加載

您沒有顯示實體的代碼。 如果您有@OneToMany@ManyToMany關系,JPA 將默認使用延遲加載。 這真的可以讓一切都減慢幅度。

4. 延遲

如果您在 SQL DB 所在的同一台機器上執行 SQL 查詢,但您的 Java 應用程序通過網絡與 SQL DB 通信,它也會導致查詢速度慢得多。

(5. 錯誤的數據庫類型。好像你構建了一個對象圖。也許看看 Neo4j ;-) )

暫無
暫無

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

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