2011-06-14 34 views
0

當前我們從Spring SimpleJdbcTemplate中檢索對象列表。第一個查詢是select *來檢索所有我們想要成爲我們的「鍵」的記錄。然後,這導致對集合的foreach循環,這反過來涉及N個查詢返回到數據庫,其中N是List的大小。做這些N個查詢還是做兩個大的select *語句並通過一個執行if語句的for循環映射它們會更有效率嗎?請參見下面的代碼:數據映射優化:X數據庫查詢與Y Java if語句

N Queries 

List keyList = Select * from keyTable; 
for(Object o: keyList) 
    { 
     List valueList = Select * from valueTable; 
     //Map valueTable to keyTable via rowmapper 
    } 




Y Java if statements 
    List keyList = Select * from keyTable; 
    List valueList = Select * from valueTable; 
    for(Object o: keyList) 
     { 
      for(Object z : valueList) 
      {  
        if(z.key == o.key) //set the value 
      } 
     } 

回答

2

我不是一個Java程序員,但不會是簡單的對數據庫進行連接,因爲大多數現代數據庫引擎的設計和建造,以優化結合處理?在語法猜測,你必須查詢

Select * from keyTable o 
inner join valueTable z 
    on o.key = z.key 

莫名其妙內你的代碼,也許像這樣:

List keyValueList = select * from keyTable o inner join valueTable z on o.key = z.key; 
+0

未經測試的代碼我想這是做到這一點的一種方式。這個問題似乎是我們在調用函數時會花費很多時間,因爲它會向數據庫伸出很多次。我不確定上述情況是否會解決問題,因爲仍然存在需要發生的內部映射。但感謝您的答案。 – Woot4Moo 2011-06-14 15:42:57

+0

你一定要避免應用程序和數據庫服務器之間的往返。你的第一個例子有N + 1次旅行,第二次旅行有2次旅行,我的想法有1次。如果往返時間是往返時間,那麼最小化這些(並且1並不比2好);如果處理檢索的數據是一直需要的,那麼您需要專注於優化。 – 2011-06-14 15:47:49

+0

同樣如此。我會嘗試實施你的解決方案,看看我得到了什麼樣的初始收益。就目前而言,我們處在2+分鐘範圍內的某個地方,它只有60個條目在數據庫中。 – Woot4Moo 2011-06-14 15:50:09

0

你應該使用SQL連接或子查詢檢索在一個單一的所有數據sql語句。這將允許數據庫利用可能可用的任何優化機制(索引和執行計劃,緩存等)。

使用SQL連接:

select key,value from keyTable k, valueTable v where k.key=v.key 

使用子查詢(僅當某個鍵具有獨特的價值):

select key, (select value from valueTable where key=k.key) from keyTable k 
1

你的選項,依次是:

  • 讓數據庫做連接。這是迄今爲止的最佳選擇,並有幾乎沒有一個理由不這樣做:
 
    select k.key, v.value from keyTable k, valueTable v where k.key=v.key 
  • 如果因任何原因,你需要做的在應用層連接,還有一個指數valueTable.key,和你所期望結果很少,做一個嵌套循環連接
 
    List keyList = Select key from keyTable; 
    for (Object k: keyList) { 
     List valueList = Select value from valueTable where key = k; 
     for (Object v: valueList) { 
      // Your code here 
     } 
    } 
  • 沒有涉及到的嵌套循環的情況下加入,做一個哈希聯接
 
    HashMap keyHash = select key, k.* from keyTable k; 
    List valueList = select * from valueType v; 
    for (Object k: valueList) { 
     if (keyHash.containsKey(k)) { 
      // Your code here 
     } 
    }