간단명료

1.1 SQL 파싱과 최적화 본문

친절한 SQL 튜닝/1장. SQL 처리 과정과 IO

1.1 SQL 파싱과 최적화

FeelGoood 2022. 2. 19. 00:30

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 핵심 엔진이다.
최적화 단계

  1. 사용자로부터 전달받은 쿼리를 수행하는 데 후보군이 될만한 실행계획들 탐색.
  2. 데이터 딕셔터리(Data Dictionary)에 수집해 둔 오브젝트 통계 및 시스템 통계정보를 이용해 각 실행계획의 예상비용 산정.
  3. 최저 비용의 실행계획 선택.

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

자주 사용하는 힌트 목록

 

728x90
반응형
Comments