본문으로 바로가기

10.(JSP) JDBC - PreparedStatement VS Statement 의 차이

category SPRING/Servlet || JSP 2021. 3. 9. 11:57
728x90
반응형
SMALL

둘다 SQL을 실행시키는 객체이다

 

*PreparedStatement


 1.여러번 수행될 때 빠른 속도를 지님

 2.쿼리에 인자를 부여할 수 있음

 3.처음 프리컴파일 된 후, 컴파일을 수행하지 않음

ex)

String sql="Select * From TEST where name=?";

PreparedStatement psmt=conn.preparedStatement(sql);

psmt.setString(1,"yoon");

ResultSet rs=psmt.executeQuery();   

Statement 와는 다르게 conn.cretateStatement() 와 비교하여 conn.preparedStatement(sql ) 쿼리문을 미리 생성한다.

실행할 때도 psmt.executeQuery() 때 쿼리를 파라미터에 넣지 않고 수행하는것을 확인할 수 있음

 

실행시 쿼리를 생성하지 않고 이미 미리 생성되있는 상태이기 때문에 Statement에 비해 반복 실행시 속도가 훨씬 빠름

 

*Statement


1.단일로 사용될 때 빠른 속도를 지님

2.쿼리에 인자를 부여할 수 없음

3.매번 컴파일을 수행해야 함

ex)

String sql= " Select * From TEST where name='Yoon' ";

Statement stmt = conn.createStatement()

ResultSet rs = stmt.executeQuery(sql);

 

  쿼리에 파라미터 값이 없고 executeQuery(sql) 메소드에 쿼리를 파타미터 값으로 넣고 있어서

 실행 전까지는 무슨 쿼리를 실행하는지 알지 못함.

 따라서 쿼리문을 실행할 때마다 생성하며 반복 실행되는 경우는 효율이 떨어짐

 

**속도비교 TEST(출처:mozi.tistory.com/29)


*table 스키마 및 데이터 건수

gSQL> CREATE TABLE PERFORMANCE (C1 INT PRIMARY KEY, C2 CHAR(30), C3 DATE);

Table created.

gSQL> SELECT COUNT(*) FROM PERFORMANCE;

COUNT(*)
--------
 1000000

1 row selected.

 

*Statement 테스트

s_sTime = System.currentTimeMillis();
Statement stmt = con.createStatement();
for(i = 0; i < 1000000; i++){
    stmt.executeQuery("SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = " + i );
}
s_eTime = System.currentTimeMillis();
System.out.println("Statement Milli Time : " + (s_eTime-s_sTim
Statement Milli Time : 124750

1,000,000건을 가져오는데 124초 걸림

 

*PreparedStatement 테스트

s_sTime = System.currentTimeMillis();
PreparedStatement pstmt = con.prepareStatement("SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = ?");
for(i = 0; i < 1000000; i++){
    pstmt.setInt(1, i);
    pstmt.executeQuery();
}
s_eTime = System.currentTimeMillis();
System.out.println("PreparedStatement Milli Time : " + (s_eTime-s_sTime));
PreparedStatement Milli Time : 25825

1,000,000건을 가져오는데 25초 걸림

 

Goldilocks 데이터베이스에서 X$STATEMENT 를 조회하면

Statement 는 매번 컴파일 되기 때문에 항상 수행횟수가 1 인 반면,

PreparedStatement 는 한번 컴파일한 구문을 사용하기 때문에 수행횟수가 증가하는 것을 확인할 수 있습니다.

gSQL> -- Statement
gSQL> SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT;

ID SESSION_ID SQL_TEXT                                                     EXECUTIONS
-- ---------- ------------------------------------------------------------ ----------
16          4 SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT          1
 0         28 SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = 38422                   1

gSQL> -- PreparedStatement
gSQL> SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT;

ID SESSION_ID SQL_TEXT                                                     EXECUTIONS
-- ---------- ------------------------------------------------------------ ----------
19          4 SELECT ID, SESSION_ID, SQL_TEXT, EXECUTIONS FROM X$STATEMENT          1
 0         28 SELECT C1, C2, C3 FROM PERFORMANCE WHERE C1 = ?                   52676

 

728x90
반응형
LIST