간단명료
1.1 SQL 파싱과 최적화 본문
1.1.1 구조적, 집합적, 선언적 질의 언어
SQL은 'Structured Query Language'의 줄임말, 구조적 질의 언어다.
원하는 결과를 구조적, 집합적으로 선언하지만, 그 결과집합을 만드는 과정은 절차적일 수밖에 없다.
즉, 프로시저가 필요한데, DBMS 내부 엔진인 옵티마이저가 만든다.
DBMS 내부에서 프로시저를 작성하고 컴파일해서 실행 가능한 상태로 만드는 전 과정을 SQL 최적화라고 한다.
1.1.2 SQL 최적화
SQL을 실행하기 전 최적화 과정.
① SQL 파싱
사용자로부터 SQL을 전달받으면 가장 먼저 SQL 파서가 파싱을 진행한다.
- 파싱 트리 생성 : SQL 문을 이루는 개별 구성요소를 분석 후 파싱 트리 생성.
- Syntax 체크 : 문법적 오류 확인. (EX. 사용할 수 없는 키워드 사용, 올바르지 않은 순서, 누락된 키워드 확인)
- Semantic 체크 : 의미상 오류 확인. (Ex. 존재하지 않는 테이블 또는 컬럼 사용, 사용한 오브젝트 권한 확인)
② SQL 최적화
다음으로 옵티마이저(Optimizer)가 SQL 최적화를 맡는다. 가장 효율적인 실행경로를 찾아주며, 데이터베이스 성능을 결정하는 가장 핵심적인 엔진이다.
③ 로우 소스 생성
옵티마이저가 선택한 실행경로를 실행 가능한 코드 또는 프로시저 형태로 포맷팅하는 단계다. 로우 소스 생성기(Row-Source Generator)가 진행한다.
1.1.3 SQL 옵티마이저
SQL 옵티마이저는 최적의 데이터 경로를 선택해 주는 DBMS 핵심 엔진이다.
최적화 단계
- 사용자로부터 전달받은 쿼리를 수행하는 데 후보군이 될만한 실행계획들 탐색.
- 데이터 딕셔터리(Data Dictionary)에 수집해 둔 오브젝트 통계 및 시스템 통계정보를 이용해 각 실행계획의 예상비용 산정.
- 최저 비용의 실행계획 선택.
1.1.4 실행계획과 비용
DBMS엔 'SQL 실행경로 미리보기' 기능이 있다. 실행계획(Excution Plan)이 바로 그것이다. 옵티마이저는 비용(Cost)을 통해 인덱스를 선택하며 여기서 비용은 쿼리를 수행하는 동안 발생할 것으로 예상하는 I/O 횟수 또는 예상 소요시간을 표현한 값이다. SQL 실행계획에 표시되는 Cost도 어디까지나 예상치다. SQL 옵티마이저가 생성한 처리절차를 사용자가 확인할 수 있게 아래와 같이 트리 구조로 표현한 것이 실행계획이다.
(3-2-5-4-1 순서로 본다.)
1.1.5 옵티마이저 힌트
네비게이션이 항상 최선의 선택을 하지 않듯, 옵티마이저 또한 그렇다. 이럴 땐 옵티마이저 힌트를 이용해 데이터 액세스 경로를 바꿀 수 있다.
힌트 사용법은 주석 기호에 +를 붙이면 된다.(-- 주석은 줄바꿈 오류가 발생할 수 있기 때문에 자제하자.)
주의사항
/*+ INDEX(A A_X01) INDEX(B, B_X03) */ ---> 모두 유효.
/*+ INDEX(C), FULL(D) */ ---> 첫 번째 힌트만 유효. ','(콤마)는 힌트와 힌트 사이에 사용하면 안된다.
SELECT /*+ FULL (EMP) */ ---> 무효. FROM 절 테이블 명 옆에 ALIAS를 지정했다면, 힌트에도 반드시 ALIAS를 사용해야 한다.
FROM EMP E
자주 사용하는 힌트 목록
'친절한 SQL 튜닝 > 1장. SQL 처리 과정과 IO' 카테고리의 다른 글
1.3 데이터 저장 구조 및 I/O 메커니즘 (0) | 2022.02.19 |
---|---|
1.2 SQL 공유 및 재사용 (0) | 2022.02.19 |