2012-08-06 2 views
0

Access 데이터베이스의 3 개 테이블에서 2 백만 행 또는 100MB의 텍스트를 읽습니다. 나는 다음과 같은 SELECT 문을 사용하여 :이 잠시 동안 (약 2 분)을 복용했다 그래서 더 빨리 만들 수있는 방법을 찾았다SQL PreparedStatement의 문제점은 무엇입니까?

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + databaseLocation + databaseName +";selectMethod=cursor; READONLY=true; TYPE=FASTLOAD"; 

con = DriverManager.getConnection(url); 

String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY, BUILDINGS.ED_ID FROM (ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID WHERE BUILDINGS.COUNTY_ID = " + county_ID; 

Statement stmt = con.createStatement(); 
ResultSet result = stmt.executeQuery(SQL); 

. 나는 준비된 진술에 대해 읽고 그것을 만들기로 결정했다. 다양한 나는 이것을 함께 넣어 자습서 다음은

String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY, BUILDINGS.ED_ID FROM (ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID WHERE BUILDINGS.COUNTY_ID = ?"; 

PreparedStatement prest = con.prepareStatement(SQL); 
prest.setString(1, county_ID); 

ResultSet result = prest.executeQuery(); 

그것은 여전히 ​​작동,하지만 지금은 15 분 이상 소요됩니다. 나는 좋은 구글을 ​​가졌지 만 내가 잘못하고있는 것을 발견 할 수 없다. 준비된 진술은 나의 특별한 문제에 적절하지 않습니까?

+2

가 얼마나 오래 쿼리가 걸립니까 SQL 주입을 방지하는 것입니다 사용하는 주요 인자? – JamesB

+0

특정 권장 사항은 없지만 더 나은 JDBC 드라이버를 얻는 방법을 조사하는 것이 좋습니다. –

+0

@JamesB 거의 문자 그대로 시간이 없습니다. 1 초도 남지 않았습니다. – Russell

답변

1

동일한 쿼리를 여러 번 실행하려는 경우 PreparedStatement를 사용하면 성능이 크게 향상됩니다. 데이터베이스는 명령문이 준비 될 때 쿼리를 구성한 다음 오버 헤드를 피하기 위해 명령문이 실행될 때마다 이것을 다시 사용합니다. 한 번만 쿼리를 실행한다면 PreparedStatement를 사용하면 성능이 향상되지 않을 것입니다.

PreparedStatement의 당신이 당신의 데이터베이스에 대해 직접 실행하는 경우

+0

흥미 롭습니다. 내가 오해 한 것 같습니다. 필자는 레코드를 검색 할 때마다 "쿼리 실행"을 생각했습니다.이 경우 레코드는 매우 많이 사용됩니다. 사실 이것이 단지 쿼리의 단일 실행이라면 나는 그것이 더 빠르지 않은 이유를 알 수 있습니다. – Russell

+0

@Russell 루프에서 여러 번 실행하는 경우 루프 밖에서 PreparedStatement를 만든 다음 루프 내에서'PreparedStatement.setString()'및'PreparedStatement.executeQuery()를 호출하기를 원한다. [here] (http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)에 나와 있습니다. 당신이하는 일인가요? – Edd

+0

@ Edd PreparedStatements를 사용하는 것에 대해 오해 한 것 같습니다. 쿼리 만 25 번만 실행합니다. 내가 읽은 많은 레코드가 속도가 빨라 졌을 것이라고 생각했지만 그렇지 않은 것 같습니다. – Russell

관련 문제