SQL 처리과정 - 파싱(Parsing), 바인드 변수

김민성·2023년 4월 4일
0
post-thumbnail

SQL 처리과정 - 파싱(Parsing), 소프트 파싱(Soft Pasing), 하드 파싱(Hard Parsing)

MySQL에서의 쿼리 처리 절차는 아래와 같다.

1. 구문 오류 체크 (parse)
2. 공유 영역에서 해당 구문 검색 (parse)
3. 권한 체크 (parse)
4. 실행 계획 수립 (parse)
5. 실행계획 공유영역에 저장(parse)
6. 쿼리 실행 (Excute)

그리고 DBMS 엔진은 요청받은 쿼리문을 실행하기 위해 파싱(Parsing)이라는 과정을 거친다.

간단하게 정리하면 아래와 같다.

공통 파싱 : 문법 체크, 권한 유무, Library Cache에 기존 쿼리가 있는지 체크

  • 2번 단계인 공유 영역에서 해당 구문이 동일한 구문을 찾게되면 6번 쿼리실행으로 건너뛴다.

소프트 파싱 : 2번에서 6번까지 바로 넘어가는 경우 (Library Cache에 기존 쿼리가 있는 경우 진행)

하드 파싱 : 1번 부터 6번까지 실행되는 경우(기존 쿼리가 없는 경우 진행)

참고

  • Library Cache는 해시 구조로 관리된다.

  • SQL 쿼리마다 해시값을 매핑해서 저장하고 SQL 쿼리를 Library Cache에서 찾을 때는 SQL 문장을 해시 함수에 적용하여 반환 되는 해시값으로 탐색한다.


바인드 변수란?

  • PL/SQL 또는 SQL 쿼리문에서 WHERE 절에 value 값으로 사용하는 변수이다.
  • 호스트 환경에서 생성되어 데이터를 저장한다.
  • print 명령어를 사용해서 변수를 확인할 수 있다.

바인드변수를 사용하는 이유

  1. 성능향상
    위에 설명된 소프트 파싱을 사용하도록 하여 성능을 향상시킨다

    아래는 자바에서의 파싱 예시이다.

    		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이 가능해 진 것이다. 
    	
  2. 동일한 쿼리의 WHERE절에 변수값 동적 반영

    • 예시
    Stirng query = "SELECT * FROM EXAMPLE_TABLE WHERE id = ?";
    PreparedStatement ps = con.prepareStatement(query);
    ps.setint(1,id);
    // 이러한 형식으로 변수에 '?'를 넣은 코드를 작성 하는것이 바인드 변수를 사용하는 것이다.
    // JAVA에서의 바인드 변수를 사용한 쿼리를 PreparedStatement라고 한다.
    

profile
정리하는 개발자

0개의 댓글