2013-03-25 220 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