2017-03-15 67 views
0

我在DB下表:質疑DB是快,但JPARepository讀取速度慢

PersonParentGrandParent Parent - PersonOneToMany關係(Person已經parentIdGrandParent - ParentManyToMany關係(grandparent_parent表)

我在PersonRepository中創建,它擴展JPARepository

@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); 

用於獲取Person的所有ID,它們在給定的GrandParent下。 該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的這樣的查詢。

爲什麼我在通過存儲庫獲取和在db中獲取之間存在這樣的差異?是否有可能解決這個問題?

回答

2

多種可能性:

1.生成的查詢

生成的查詢看起來相當沒什麼問題。它與您的@Query註釋中的查詢完全相同。

2. SQL結果到Java對象轉換

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

3.延遲加載

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

4.延遲

如果執行的SQL查詢在同一臺機器上在SQL數據庫是,但你的Java應用程序通過網絡與SQL數據庫通信,它可能會導致更慢的查詢,也。

(5.錯誤的DB,看起來像你建立一個對象圖。也許看看Neo4j ;-)

+0

1.正如我所說,我可以將它更改爲一個連接,但查詢很好,正如您所描述的。 – ByeBye

+0

2,3。正如你所看到的,我只讀取了id,沒有任何地方的LazyLoading – ByeBye

+0

4.不,我從外部機器遠程執行它 – ByeBye

相關問題