[친절한 SQL 튜닝] 1.1 SQL 파싱과 최적화 [1]
SQLP를 준비하면서 [친절한 SQL 튜닝]이라는 책을 추천받게 되었다.
앞으로 이 책을 공부하면서 조금씩 정리를 하려고 한다.
1.1 SQL 파싱과 최적화
1.1.1 구조적, 집합적, 선언적 질의 언어
SQL이란 무엇인가
- SQL은 'Structured Query Language'의 줄임말로, 구조적 질의 언어라고 불린다.
- SQL은 기본적으로 구조적(Structerd)이고, 집합적(Set-based)이고 선언적(Declarative)인 질의 언어이다.
SQL 옵티마이저
원하는 결과집합을 구조적, 집합적으로 선언하지만, 그 결과집합을 만드는 과정은 절차적일 수밖에 없다.
즉, 프로시저가 필요한데, 그런 프로시저를 만들어 내는 DBMS 내부 엔진을 SQL 옵티마이저라고 부른다.
1.1.2 SQL 최적화
SQL 최적화
DBMS 내부에서 프로시저를 작성하고 컴파일해서 실행 가능한 상태로 만드는 전 과정을 SQL 최적화라고 한다.
1. SQL 파싱 : 사용자로부터 SQL을 전달받아 SQL 파서(Parser)가 파싱을 진행
1) 파싱 트리 생성 : SQL문을 이루는 개별 구성요소를 분석해서 파싱 트리 생성
2) Syntax 체크 : 문법적 오류가 없는지 확인
3) Semantic 체크 : 의미상 오류가 없는지 확인
2. SQL 최적화 : 옵티마이저가 미리 수집한 시스템 및 오브젝트 통계정보를 바탕으로 다양한 실행경로를 생성해서 비교한 후 가장 효율적인 하나를 선택(데이터베이스 성능을 결정하는 가장 핵심적인 엔진)
3. 로우 소스 생성 : SQL 옵티마이저가 선택한 실행경로를 실제 실행 가능한 코드 또는 프로시저 형태로 포맷팅 하는 단계
1.1.3 SQL 옵티마이저
SQL 옵티마이저는 사용자가 원하는 작업을 가장 효율적으로 수행할 수 있는 최적의 데이터 액세스 경로를 선택해 주는 DBMS의 핵심 엔진이다.
1. 옵티마이저 최적화 단계
1) 사용자로부터 전달받은 쿼리를 수행하는 데 후보군이 될만한 실행계획 탐색
2) 데이터 딕셔너리(Data Dictionary)에 미리 수집해 둔 오브젝트 통계 및 시스템 통계정보를 이용해 각 실행계획의
예상비용을 산정
3) 최저 비용을 나타내는 실행계획을 선택
1.1.4 실행계획과 비용
실행계획이란 SQL 옵티마이저가 생성한 처리절차를 사용자가 확인할 수 있게 트리 구조로 표현한 것이다.
실행계획을 통해 자신이 작성한 SQL이 테이블을 스캔하는지 인덱스를 스캔하는지를 확인할 수 있다.
또한 옵티마이저가 생성한 처리방법은 비용(Cost)을 근거로 정해지는데,
비용(Cost)이란 쿼리를 수행하는 동안 발생할 것으로 예상하는 I/O 횟수 또는 예상 소요시간을 표현한 값이다.
* SQL 실행계획에 표시되는 비용은 어디까지나 예상치다. 실행경로를 선택하기 위해 옵티마이저가 여러 통계정보를 활용해서 계산해 낸 값이다. 실측치가 아니므로 실제 수행할 때 발생하는 I/O 또는 시간과 많은 차이가 날 수 있다.
1.1.5 옵티마이저 힌트
통계정보에 담을 수 없는 데이터 또는 업무 특성을 활용해 개발자가 직접 더 효율적인 액세스 경로를 찾아낼 수 있다.
이것을 옵티마이저 힌트라고 부른다. 힌트를 통해 데이터 액세스 경로를 바꿀 수 있다.
아래처럼 주석 기호에 '+'를 사용하면 된다.
SELECT /*+ INDEX(A 고객_PK) */
고객명, 연락처, 주소, 가입일시
FROM 고객 A
WHERE 고객ID = '0000000008'
* 주의사항
1. 힌트 안에 인자를 나열할 땐, ','(콤마)를 사용할 수 있지만, 힌트와 힌트 사이에 사용하면 안 된다.
/*+ INDEX(A A_X01) INDEX(B, B_X03) */ 모두 유효
/*+ INDEX(C), FULL(D) */ 첫 번째 힌트만 유효
2. 테이블을 지정할 때 아래와 같이 스키마명까지 명시하면 안 된다.
SELECT /*+ FULL(SCOTT.EMP) */ 무효
FROM EMP
3. FROM절 테이블명 옆에 ALIAS를 지정하면, 힌트에도 반드시 ALIAS를 사용해야 한다.
SELECT /*+ FULL(EMP) */ 무효
FROM EMP E
옵티마이저 힌트는 애플리케이션 환경에 따라 다르다.
기본적으로 옵티마이저의 판단대로 사용해도 별문제가 없는 시스템이 있다면, 중대한 시스템의 경우 옵티마이저의 자율적 판단에 맡기는 것은 좋은 선택이라고 볼 수 없다.
이왕 힌트를 사용한다면, 빈틈없이 기술하는 것이 좋다.