2017-04-17 7 views
-1

Oracle JDBC에서 setString() 및 setDate()에 대한 몇 가지 문제점이 있습니다. setString() 및 setDate()에 대한 테스트를 시도 할 때 setDate()가 setString()보다 빠릅니다. 대부분의 경우. 누군가 내가 이것을 설명하도록 도울 수 있습니까? 여기 내 테스트 : 도움을Oracle JDBC에서 setString() 및 setDate()를 수행 했습니까?

private void doSelectTest() 
{ 
    System.out.println("[OUTPUT FROM SELECT]"); 
    //String query = "SELECT LAST_NAME FROM Employees WHERE HIRE_DATE = ?"; 
    String query = "SELECT LAST_NAME FROM Employees WHERE HIRE_DATE = TO_DATE(?,'yyyy-MM-dd')"; 
    try 
    { 
     PreparedStatement st = conn.prepareStatement(query); 
     //st.setDate(1,java.sql.Date.valueOf("2003-06-17")); 
     st.setString(1,"2003-06-17"); 
     ResultSet r = st.executeQuery(); 
     System.out.println(query.toString()); 
    } 
    catch (Exception ex) 
    { 
     System.err.println(ex.getMessage()); 
    } 
} 

감사합니다.

+0

* "setDate()가 setString()"보다 빠르다는 주장을 일부 데이터와 함께 백업하십시오. 나는 테이블에서 기록을 읽는 행위가 성과의 주요 부분이 될 것으로 기대합니다. 'HIRE_DATE '에 인덱스가 없다면 전체 테이블 스캔을 의미 할 것이고, 이는'Date '또는'String'으로 인수를 전송할 때의 성능 차이보다 매우 느립니다. – Andreas

+0

문제를 이해하셨습니까? 동일한 테이블을 사용하여 쿼리하고 있습니다. 인덱스, 파티션 등의 모든 성능을 건너 뜁니다. 단지 prepareDat와 setString에 preparestatement를 요청하고 싶습니다. –

+0

그래, 문제를 이해하고,'Date'와'String'의 성능 차이가 쿼리를 실행할 때 무시할만한 수준이 될 것이라고 기대한다. 색인 당신은 충분한 정보를 제공하지 않았기 때문에 귀하의 주장을 증명할 수있는 나의 요구가 있으므로 어떤 숫자를 백업해야하는지 알 수 있습니다. 우리는 그들이 무엇인지 알지 못한다면 당신의 숫자를 설명하는 것을 정말로 도울 수 없습니다. – Andreas

답변

3

먼저, 실제로 타이밍을 측정하는 방법이 궁금합니다. 중요하지 않은 벤치 마크를 작성하는 것은 정말 쉽습니다.

둘째, "setDate"및 "setString"외에도 많은 부분이 있습니다. 일부는 클라이언트 쪽이고 일부는 서버 쪽입니다.

예를 들어 "setDate"예제에서는 java.sql.Date.valueOf ("2003-06-17")`도 수행하고 있으므로 문자열 변환에서 발생하는 오버 헤드를 고객.

SQL 문에 "TO_DATE (?, 'yyyy-MM-dd')"가 포함 된 "setString"예제의 경우 문자열의 날짜 변환을 측정하고 있지만 이번에는 서버에서 수행합니다 - 측면 (데이터베이스에서).

그래서 나는 사과를 오렌지와 비교하고 있다고 생각합니다.

+0

감사합니다. 나는 이것이 최선의 대답이라고 생각한다. –

0

Date은 보통 long 값으로 표시됩니다. 따라서 64 비트로 전송할 수 있습니다. Stringlength에 여러 문자를 더한 것입니다. 또한 서버는 구문 분석하고 디코드해야합니다 (아마도 long).