2009-06-02 4 views
1

제 목표는 Emp 테이블에서 특정 직원의 DeptNames를 얻는 것입니다. 그러나 직원 수는 다양합니다. 아래의 접근법이 정확하고 아래의 접근법 중 어느 것이 더 나은 성능을 발휘하는지 알려주십시오. 아니면 그것에 대해 더 좋은 방법이 있습니까?성능 측면에서 어떤 접근 방식이 더 효과적입니까? (JDBC의 준비된 문에서 가변 매개 변수 마커 사용과 관련하여)

PreparedStatement pstmt = conn.prepareStatement("SELECT Dept from Emp WHERE EmpNum = ? "); 
    for (int i = 0, len = empNumberList.size(); i < len; i++) { 
     pstmt.setLong (1, empNumberList.get(i)); 
     ResultSet rs = pstmt.executeQuery(); 
    } 

또는

StringBuffer buffer = new StringBuffer(); 
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?"); 
for (int i = 0, len = empNumberList.size(); i < len; i++) { 
    buffer.append(",?"); 
} 
buffer.append(")"); 
PreparedStatement pstmt = con.prepareStatement(buffer.toString()); 
for(int i = 0; i < len; i++) { 
pstmt .setLong(i, empNumberList.get(i)); 
} 
ResultSet rs = pstmt .executeQuery(); 

또는이 작업을 수행하는 다른 더 좋은 방법이있다? 제발 조언. 미리 감사드립니다!

Ravilla

답변

0

나는

은 말할 것 "EMP를 구별 부서를 선택 WHERE EMPNUM IN ("+ 쿼리 + ")"

다음 setLong() s는 가장 좋은 방법이 될 것이다 일 아마도 최고의 성능이지만, 성능을 확신하는 유일한 방법은 프로파일 링하는 것입니다.

2

일반적으로 서버 왕복은 대부분의 (사소한) 쿼리에서 상당한 비용으로 간주되기 때문에 하나의 쿼리를 수행하면 여러 쿼리가 필요합니다.

데이터베이스 공급 업체 인 JDBC 또는 드라이버는 전달할 수있는 매개 변수 수를 제한 할 수 있으므로주의해야합니다.

다른 포스터처럼 : 클라이언트를 필터링 할 필요가 없습니다. 이 줄에는 DISTINCT를 사용하십시오.

0

일반적으로 데이터베이스 쿼리와 같은 두 번째 옵션은 더 많은 시간이 걸릴 것입니다. 내가 두 번째는 아마 더 빠를 것이라는 예상에 동의

StringBuffer buffer = new StringBuffer(); 
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?"); 
for (int i = 1, len = empNumberList.size(); i < len; i++) { // one ? was written 
    buffer.append(",?"); 
} 
buffer.append(")"); 
PreparedStatement pstmt = con.prepareStatement(buffer.toString()); 
for(int i = 0; i < len; i++) { 
pstmt .setLong(i+1, empNumberList.get(i)); // pstmt setXXX() are 1 based 
} 
ResultSet rs = pstmt .executeQuery(); 
0

:

게다가, 당신은 당신의 코드에서 버그가 있습니다.

그러나 실제로 알고 싶은 경우 : 벤치 마크. 성능 결과는 종종 직관적이지 않으며 플랫폼, 데이터베이스, 아키텍처 및 버전에 따라 다릅니다. 그래서 스스로 시험해보고 그 차이를 측정하십시오.