바인드변수를 사용해야 하는 이유
오라클에서는 SQL을 실행하기 전에 하드파싱 or 소프트파싱이라는
과정을 거친다.
2023.07.18 - [Oracle] - 쿼리 처리 원리
쿼리 처리 원리
SQL의분석 SQL은 자바 같은 프로그래밍 언어와 달리 실행하기 전에 문법적인 에러를 검출할 방법이 없다. (자바는 컴파일 할 때 문법적에러를 검출 할 수 있다) 그래서 SQL을 실행하기 전에 분석을
hamutang.tistory.com
동일한 SQL문이 라이브러리캐시(공유 풀)에 존재하면 소프트파싱과정을 거쳐
실행되기 때문에 SQL이 빨리 실행될 수 있도록 도와준다.
즉, SQL문이 완전히 동일해야 효율이 좋다
아래 예시를 살펴보자.
바인드변수 사용 전
1
2
3
4
5
6
7
|
public void login(String loginId) throws Exception{
String stmt = "SELECT * FROM USER WHERE LOGIN_ID = '" + loginId +"' ";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(stmt);
/*이하 생략*/
}
|
cs |
위와 같이 사용하면 아래와 같은 SQL이 실행된다.
SELECT * FROM USER WHERE LOGIN_ID = 'A'
SELECT * FROM USER WHERE LOGIN_ID = 'B'
SELECT * FROM USER WHERE LOGIN_ID = 'C'
SELECT * FROM USER WHERE LOGIN_ID = 'D'
LOGIN_ID 부분이 A, B, C, D ~ 사용자 아이디에 따라 SQL문이 바뀐다.
(SQL문이 완전히 동일하지 않다)
바인드변수 사용 후
1
2
3
4
5
6
7
8
|
public void login(String loginId) throws Exception{
String stmt = " SELECT * FROM USER WHERE LOGIN_ID = ? ";
PreparedStatement st = con.prepareStatement(stmt);
st.setString(1, loginId);
ResultSet rs = st.executeQuery();
/*이하 생략*/
}
|
cs |
위와 같이 사용하면 아래와 같은 SQL이 실행된다.
SELECT * FROM USER WHERE LOGIN_ID = :1
다양한 LOGIN_ID가 들어와도
LOGIN_ID 부분이 :1로 SQL문이 바뀌지 않는다.
(SQL문이 완전히 동일하다)
정리
바인드변수 '?'가 있기에 동일한 SQL문이 수행되고
라이브러리캐시에 등록되어 있는 SQL정보가 재사용되어
실행 효율이 좋아지기 때문에(소프트파싱)
바인드변수를 사용하는 것이 좋다.
(소프트파싱=SQL검증과 실행계획수립 생략하고 SQL 실행)
'Oracle' 카테고리의 다른 글
DB 재능 기부 세미나(DBian, Oracle, SQL Server) (0) | 2023.11.12 |
---|---|
SQL튜닝 수강 기록 (0) | 2023.10.21 |
REDO 로그 파일 & REDO 데이터(2) (0) | 2023.10.18 |
REDO 로그 파일 & REDO 데이터(1) (0) | 2023.10.15 |
오라클의 메모리 관리(PGA & SGA) (0) | 2023.10.03 |