2012-12-12 30 views
7

我想要一個Java + JPA/Hibernate + Mysql的具體案例,但我認爲你可以將這個問題應用於很多語言。何時使用查詢或代碼

有時我必須對數據庫執行查詢以獲取某些實體,例如員工。假設您需要一些特定的員工(以'John'作爲他們的名字的員工),您是否希望做一個查詢來返回這組精確的員工,還是您希望搜索所有員工,然後使用編程語言來檢索那些你感興趣的? 爲什麼(緩解,效率)? 哪(一般情況下)效率更高?

取決於表的大小,一種方法比另一種更好嗎?

考慮:

  • 相同的複雜,可重用性在這兩種情況下。
+4

有什麼比較好的:在家裏儲存大量食物或者一點一點地購買食物?當你旅行很多?舉辦派對時?這取決於,不是嗎?同樣,最好的方法是性能優化問題。這涉及很多變數。藝術是既要防止自己在設計解決方案時進入角落,而且要在以後進行優化,當你知道自己的瓶頸時。一個很好的出發點是在這裏:http://en.wikipedia.org/wiki/Performance_tuning人認爲可能是或多或少普遍有所幫助:封裝數據訪問良好。 –

+0

我會說你的答案確實是你最能學習的答案! – dgmora

+0

@ dgarcia,謝謝。如果你想要接受的話,我會將它提升爲一個答案。 –

回答

4

在編程中經常會用到一般技巧 - 用內存支付操作加速。如果你有很多員工,並且你要逐一查詢他們中的很大一部分(比如75%會被查詢一次或另一次),然後查詢一切,緩存它(非常重要! ),並在內存中完成查找。下一次查詢時,跳過RDBMS,直接進入緩存,然後快速查找:與內存中哈希查找相比,往返數據庫的往返代價非常昂貴。另一方面,如果您訪問的是一小部分員工,則應該只查詢一名員工:從RDBMS到您的程序的數據傳輸需要大量時間,大量網絡帶寬,大量內存在你身邊,還有很多RDBMS方面的內存。查詢很多行以拋棄所有行,但從來沒有任何意義。

10

總是對數據庫執行查詢。如果你不需要將更多的數據複製到客戶端,並且編寫數據庫以有效地過濾數據,那麼肯定會比代碼更有效。

我能想到的唯一例外是,如果過濾條件計算複雜,並且您可以將計算擴展到比數據庫更多的CPU功率。

在我有一個數據庫的情況下,服務器比客戶端擁有更多的CPU能力,所以除非重載只會更快地爲相同數量的代碼運行查詢。

此外,您必須編寫更少的代碼才能使用Hibernates查詢語言對數據庫執行查詢,而不必編寫代碼來操作客戶端上的數據。 Hibernate查詢還可以在配置中使用任何客戶端緩存,而無需編寫更多代碼。

2

這是情景。我認爲一般來說,最好使用sql來獲得確切的結果集。

加載所有實體然後以編程方式搜索的問題是您要加載所有實體,這可能需要大量內存。另外,您必須搜索所有實體。爲什麼當你可以利用你的RDBMS並獲得你想要的確切結果時呢?換句話說,爲什麼要加載一個可能使用太多內存的大數據集,然後處理它,以便讓RDBMS爲您完成工作?另一方面,如果你知道你的數據集的大小不是太大,你可以將它加載到內存中,然後查詢它 - 這有一個好處,就是你不需要去RDBMS,它可能會或可能不需要通過您的網絡,具體取決於您的系統架構。

但是,即使如此,您仍然可以使用各種緩存實用程序,以便共同查詢結果被緩存,從而消除了自己緩存數據的優勢。

4

一般來說,我會讓數據庫做數據庫擅長的。過濾數據是數據庫真正擅長的事情,所以最好留在那裏。

也就是說,在某些情況下,您可能只想抓住它們,然後在代碼中進行過濾。我能想到的一點是,如果行數相對較小,並且您計劃將它們緩存在您的應用中。在這種情況下,您只需查找所有行,緩存它們,然後根據緩存中的內容進行後續過濾。

2

請記住,您的方法應該隨着時間而擴展。隨着時間的推移,可能是一個小型數據集可能會變成一個龐大的數據集。我們遇到了程序員的問題,該程序員編寫應用程序來查詢整個表,然後對其執行操作。當只有100行和兩個子查詢時,這種方法運行良好,但隨着數據的增長,這些性能問題逐漸顯現。插入日期過濾器只能查詢最近365天,可以幫助您的應用程序更好地擴展。

1

- 如果你正在尋找具體的答案,休眠,查馬克@的回答

鑑於員工例子 - 假設員工人數規模可以隨着時間的推移,它是更好地使用一種方法來查詢數據庫的確切數據。但是,如果您正在考慮類似Department(例如),數據快速增長的可能性較小的情況,查詢所有這些數據並將其記錄在內存中非常有用 - 這樣您就不必訪問外部資源(數據庫),這可能是昂貴的。

所以一般參數是這些,數據的

  1. 縮放
  2. 關鍵性數據的經營業務
  3. 體積
  4. 頻率使用的

放某種意義上說,當數據不會頻繁擴展,並且數據不是關鍵任務,數據量可以在a上的內存中管理應用服務器並經常使用 - 如果需要,將它全部加入並以編程方式過濾它們。

如果否則只獲得特定的數據。

1

有什麼比較好的:在家裏儲存大量食物或者一點一點地購買食物?當你旅行很多?舉辦派對時?這取決於,不是嗎?同樣,最好的方法是性能優化問題。這涉及很多變數。藝術是既要防止自己在設計解決方案時進入角落,而且要在以後進行優化,當你知道自己的瓶頸時。一個好的起點在這裏:en.wikipedia.org/wiki/Performance_tuning一個想法可能或多或少地普遍有用:將數據訪問封裝得很好。

+0

我沒有選擇它作爲回答,因爲它不是「回答」筆直的主要議題,但我認爲這是非常有用 – dgmora