SQL문 실행 과정에 대한 포스팅입니다.
DBMS 엔진은 요청받은 쿼리문을 실행하기 위해 파싱(Parsing)이라는 과정을 진행합니다.
이 파싱에는 문법 체크, 권한 유무, Library cache에 기존 쿼리가 있는지를 체크하는 공통 파싱
그리고 Library chace에 기존 쿼리가 있는 경우 진행하는 소프트 파싱(Soft parsing)
기존 쿼리가 없는 경우 진행하는 하드 파싱(Hard parsing) 총 3가지가 있습니다 (아래 표에 조금 더 상세히 정리)
파싱 종류 | 주요 내용 | 비고 |
공통 파싱 | Syntax check(문법 체크) Semantic check(오브젝트 및 권한유무 체크, 오브젝트 : 테이블, 컬럼 등) Library cache check (쿼리가 저장되어 있는 검사) |
Library cache에 쿼리가 있는 경우 : 저장된 쿼리 실행계획 사용, Soft parsing Library cache에 쿼리가 없는 경우 : 실행 계획과 소스코드를 만듬, Hard parsing |
하드 파싱(Hard Parsing) | Library cache에 이전에 실행했던 쿼리가 없는 경우 진행 쿼리 실행 계획을 만들기 위해 아래 2가지 과정을 거침 Optimization : 최적화한 쿼리 실행 계획 을 만듬 Row source generation : DB엔진이 실행할 수 있는 프로그램 소스 생성 |
Optimization 과정 상세 1. Query Transform : 쿼리 블록 단위로 변형된 쿼리 생산 ex. 서브쿼리를 조인으로, 인라인뷰 해체 등 2. Plan Generator : 쿼리 실행 계획 생성(후보군을 포함한 다수 생성) 3. Estimator : 쿼리 실행 계획들의 Cost를 계산하고 최소비용의 SQL 문장을 Row source generator에게 전달 |
소프트 파싱(Soft Parsing) | Library cache에 이전에 실행했던 쿼리가 있는 경우 소프트 파싱 진행 | Library cache에 저장되어있는 쿼리 실행계획을 바로 사용합니다. |
이해를 돕기 위해 쿼리 처리과정 그림도 1개 첨부드립니다.
참고 : Library Cache는 해시 구조로 관리됩니다. SQL 쿼리마다 해시값을 매핑해서 저장하고 SQL 쿼리를 Library Cache에서 찾을 때는 SQL 문장을 해시 함수에 적용하여 반환 되는 해시값으로 탐색합니다.
기타 궁금하신 사항은 댓글 남겨주세요.
감사합니다.
[참고 자료]
1. 정희락, 불친절한 SQL 프로그래밍, 데비안
2. 구루비, SQL 파싱 부하, http://www.gurubee.net/lecture/2392
[DB] 쿼리 조건문 WHERE 1=1, WHERE 절에 1=1 사용 하는 이유 (동적 쿼리) (0) | 2021.06.05 |
---|---|
[Oracle] 오라클 테이블, 컬럼, 인덱스, 코멘트 정보 조회 (0) | 2021.05.29 |
[Oracle DB] 오라클 DB 백그라운드 프로세스별 역할 (0) | 2021.04.18 |
[DB 정규화] 1정규형, 2정규형, 3정규형 (0) | 2021.04.17 |
[Oracle] 연속으로 된 날짜 만들기 (CONNECT BY LEVEL 활용) (1) | 2021.03.31 |