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

멀티 스레딩을 시도해 보셨습니까? –

+0

데이터베이스가 Java가 아닌 데이터베이스 프로세스에 있습니까? 프로파일 러를 사용하십시오. while 루프 내에 특별히 문제가있는 것 같지 않습니다. 인덱싱되지 않으면 SQL이 느린 것을 상상할 수 있습니다. –

+2

ArrayList를 프레시화하면 문제가 완화됩니다. 기본 크기는 10이고 크기는 (용량 * 3)/2 + 1로 커집니다. 크기가 커지면 이전 배열의 내용을 새 배열에 복사해야합니다. 멤버쉽 클래스를 추측하고있는 것은 아닙니다. 무거운? – Erik

답변

0

나는이 아니 while 루프하지만, 상당한 시간을 할애해야하는 데이터베이스에서 데이터를 검색하는 시간을 추측 -이 결과 집합 반복 중입니다.

while 루프에 개체를 만들지 말고 결과 집합을 반복하고 필요한 시간을 확인하십시오. 거의 같아야합니다.

+0

nope. 나는 브레이크 포인트에서 while 루프가 너무 많은 시간이 걸리는 것을 테스트했다. –

+0

while 루프가 비어있는 동안 테스트 했습니까? 타이밍은 어때? 다른 가능성은 MembershipMemberInterestsVo의 생성자에서 수행되는 무거운 작업 일 수 있습니다. –

+0

스레드 덤프 몇 가지 도움이 될 수 있습니다. 데이터 검색에서 지출 시간을 확인하려면 스택을 확인하십시오. – enigma

5

SQL 문에 문제가있을 가능성이 큽니다. 목록에 4,000 개의 항목을 추가해도 눈에 띄는 시간은 없습니다.

이 당신이 결과 집합으로 전체 테이블로 끝날 오타

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

없는 경우.

+0

그래서 궁극적으로 데이터 검색 시간이 짧습니다. :) –

+0

감사합니다. 조사를 계속하고이 문제를 다시 해결할 것입니다. 위의 의견에서 제안을 시도하겠습니다. –

관련 문제