2012-02-17 52 views
1

我有一個有很多列的大表。在不同的用例中,我需要從這個表中加載不同的列,但通常我不需要所有的列。所以現在我想我應該從這張大桌子上選擇必要的專欄。在查詢中減少列數的JPA性能改進

比如我有一個簡單的POJO喜歡UseCase1我用這個命名查詢:

SELECT NEW UseCase1(t.a, t.b, t.c) FROM MyBigTable t 

在更新語句我也只更新A,B,C場。

所以問題是,這是一個很好的解決方案,如果我無法更改表格,可以提高性能?這會提高性能嗎? :)

+1

你可以在表中添加索引嗎? – JStead 2012-02-17 12:49:22

+0

是的,我可以,但如果我添加索引,網絡上發送數據的數量將保持不變。 – nerd 2012-02-17 13:00:04

+0

你只能通過測量來判斷它是否值得。但通常情況下,這樣做並不會獲得太多收益。您最好通過分析並定義索引來確保查詢速度快,並確保使用只返回所需行的查詢(您的示例選擇所有行,這通常是一個非常糟糕的主意) – 2012-02-17 13:40:26

回答

1

我們有類似的情況,你可以看到使用這種技術的性能改善2例。

  1. 如果您的表格有超過40-50列,並且只希望選擇5-10個值。
  2. 如果您的Bean定義了非懶惰集合映射。然後,避免在構造此屬性將是巨大的儲蓄。(我們這一次的工作極大地)

像@JB說,當我們談論的性能沒有什麼可以不測量it.These 2點是我一般敲定經驗。

+0

嗨ManuPK,第一個案例是我的,我有一個約40列的表,在大多數情況下,我只需要10-20列。我處於實現的中間(從舊的Entity Bean到JPA的重構),並且我想在完成重構之後進行性能優化,並且是的,我想要進行測量。 :)我只是想知道是否有人有過類似情況的經歷。 – nerd 2012-02-17 18:11:17

0

您還可以通過使用@Basic(fetch = LAZY)(例如,)來延遲加載單個非關係字段(例如字符串)。

@Basic(fetch = LAZY) 
private String description; 

此字段的表列不會被加載。請注意,當您訪問該字段時,它將被延遲加載一個可能會成爲不同性能問題的查詢(N + 1選擇)。