1. 구문 오류 체크 (parse)
2. 공유 영역에서 해당 구문 검색 (parse)
3. 권한 체크 (parse)
4. 실행 계획 수립 (parse)
5. 실행계획 공유영역에 저장(parse)
6. 쿼리 실행 (Excute)
그리고 DBMS 엔진은 요청받은 쿼리문을 실행하기 위해 파싱(Parsing)이라는 과정을 거친다.
간단하게 정리하면 아래와 같다.
공통 파싱 : 문법 체크, 권한 유무, Library Cache에 기존 쿼리가 있는지 체크
소프트 파싱 : 2번에서 6번까지 바로 넘어가는 경우 (Library Cache에 기존 쿼리가 있는 경우 진행)
하드 파싱 : 1번 부터 6번까지 실행되는 경우(기존 쿼리가 없는 경우 진행)
Library Cache는 해시 구조로 관리된다.
SQL 쿼리마다 해시값을 매핑해서 저장하고 SQL 쿼리를 Library Cache에서 찾을 때는 SQL 문장을 해시 함수에 적용하여 반환 되는 해시값으로 탐색한다.
성능향상
위에 설명된 소프트 파싱을 사용하도록 하여 성능을 향상시킨다
아래는 자바에서의 파싱 예시이다.
String variable = "example_value";
String query = "SELECT * FROM EXAMPLE_TABLE WHERE variable = " + variable;
// 위 처럼 동적으로 변하는 값을 위하여 코드를 작성했지만 저 방법은 매번 변수가 바뀌기 때문에 공유 영역에 있는 쿼리를 사용할 수 없다
// 즉, HardParsing이 일어나게 된다. 그래서 바인드 변수를 사용하면 공유 영역에 있는 쿼리를 사용할 수있다.
String query = "SELECT * FROM EXAMPLE_TABLE WHERE variable = ?";
// 이 경우 쿼리 자체에 변수를 사용하고 있어서 공유 영역에 저장되어 있는 쿼리와 무조건 동일해질 수 있다.
// Cursor Sharing 이 되어서 SoftParsing이 가능해 진 것이다.
동일한 쿼리의 WHERE절에 변수값 동적 반영
Stirng query = "SELECT * FROM EXAMPLE_TABLE WHERE id = ?";
PreparedStatement ps = con.prepareStatement(query);
ps.setint(1,id);
// 이러한 형식으로 변수에 '?'를 넣은 코드를 작성 하는것이 바인드 변수를 사용하는 것이다.
// JAVA에서의 바인드 변수를 사용한 쿼리를 PreparedStatement라고 한다.