2013-03-25 222 views
1

此select語句返回4k +行。在我的應用程序中花費的時間是while循環。單獨的循環需要2到4分鐘。關於如何優化它的任何想法?While循環花費太多時間

不必太擔心查詢本身,因爲它不會在查詢響應上花費太多時間。

ArrayList<MembershipMemberInterestsVo> list = new ArrayList<MembershipMemberInterestsVo>(); 
StringBuffer sql = new StringBuffer(); 
      sql.append("SELECT to_char(mai.id_info) as id, "); 
      sql.append("to_char(mai.field_title) as title, "); 
      sql.append("to_char(mmi.member_id) as membership_id "); 
      sql.append("FROM memserv_member_interests mmi, memserv_add_info mai "); 
      sql.append("WHERE mmi.interests like '%-' || mai.memserv_id || '-%' "); 
      sql.append("AND mai.soc_body_id = ? "); 
      sql.append("UNION "); 
      sql.append("SELECT to_char(mit.interest_id) as id, "); 
      sql.append("to_char(mit.text) as title, "); 
      sql.append("to_char(mit.member_id) as membership_id "); 
      sql.append("FROM memserv_member_interest_text mit "); 
      sql.append("WHERE society_id = ?"); 

      pstmt = conn.prepareStatement(sql.toString()); 
      pstmt.setString(1, societyId); 
      pstmt.setString(2, societyId); 

      rs = pstmt.executeQuery(); 

      MembershipMemberInterestsVo vo = null; 
      while (rs.next()) { 
       vo = new MembershipMemberInterestsVo(); 
       vo.setInterestId(rs.getString("id")); 
       vo.setMembershipId(rs.getString("membership_id")); 
       vo.setTitle(rs.getString("title")); 
       vo.setSocietyId(societyId); 
       list.add(vo); 
      } 
+0

你試過多線程嗎? – 2013-03-25 09:52:10

+0

關於Java進程而不是數據庫高的CPU?使用分析器。看起來在while循環內沒有任何特別的問題。我可以想象,如果SQL沒有編入索引,SQL會很慢。 – 2013-03-25 09:52:38

+2

推廣ArrayList應該做一些工作來緩解你的問題。默認大小是10,它增長(容量* 3)/ 2 + 1。當它增長時,你必須將舊數組的內容複製到新數組中。我猜測Membership *類並不是全部重? – Erik 2013-03-25 09:53:20

回答

0

我想它不是while循環,而是從數據庫中檢索,必須採取相當長的時間數據的時間 - 這是遍歷結果集時。

不要在while循環中創建任何對象,只需遍歷結果集並查看所需的時間即可。應該幾乎相同。

+0

nope。我用斷點測試了while循環是需要太多時間的。 – 2013-03-25 09:53:07

+0

你用空while循環測試了嗎?什麼時候呢?只有其他可能性可能是某些繁重的操作在MembershipMemberInterestsVo的構造函數中完成。 – 2013-03-25 09:54:46

+0

幾個線程轉儲可能會有所幫助。檢查堆棧以確認它在數據檢索中的花費時間。 – enigma 2013-03-25 09:57:53

5

這個問題很可能與您的SQL語句有關。將4,000個條目添加到列表中並不需要很長的時間。

如果這不是一個錯字

WHERE mmi.interests like '%-' || mai.memserv_id || '-%' 

你結束了整個表的結果集。

+0

因此,最終歸結爲數據檢索時間:) – 2013-03-25 09:56:40

+0

謝謝,將繼續調查,並回到這一點。讓我試試firs.t上面評論的建議 – 2013-03-25 09:59:01