SQL은 Structured Query Language의 줄임말이다. 말 그래도 구조적 질의 언어다.
원하는 결과집합을 구조적,집합적으로 선언하지만 그 결과 집합을 만드는 과정은 절차적일 수 밖에 없다. 즉 프로시저가 필요한데 그런 프로시저를 만들어내는 DBMS내부엔진이 바로 SQL옵티마이저이다.
Oracle 기준으로 자세히 표현하면 아래 그림과 같다.
아래의 표는 위의 사진에서 표현된 각 서브엔진의 역할을 요약한 것이다.
쿼리 최적화 과정을 다음과 같이 설명하고 있다. Parser와 Optimizer역할에 해당하는 내용임을 알 수 있다.
: SQL 옵티마이저는 사용자가 원하는 작업을 가장 효율적이고 수행할 수 있는 최적의 데이터 액세스경로를 선택해 주는 DBMS의 핵심엔진이다.
비용은 쿼리를 수행하는 동안 발생할 것으로 예상되는 I/O 횟수또는 예상소요시간을 표현한 값이다. 실행경로를 선택하기 위해 옵티마이저가 여러 통계정보를 활용해서 계산해 낸 값이다. 실측치가 아니므로 실제 수행할 때 발생하는 I/O 또는 시간과 많은 차이가 날 수 있다.
: 통계정보가 정확하지 않거나 기타 다른 이유로 옵티마이저가 잘못된 판단을 할 수 있다. 그럴 때 프로그램이나 데이터 특성 정보를 정확히 알고 있는 개발자가 직접 인덱스를 지정하거나 조인 방식을 변경함으로써 더 좋은 실행계획으로 유도하는 메커니즘이 필요한데 옵티마이저 힌트가 바로 그것이다.
SELECT /* LEADING(E2 E1) USE_NM(E1) INDEX(E1 EMP_EMP_ID_OK
USE_MERGE(J) FULL(J)*/
E1.FIRST_NAME, E1.LAST_NAME, J.JOB_ID, SUM(E2.SALARY) TOTAL_SAL
FROM EMPLOYEES E1, EMPLOYEES E2, JOB_HISTORY J
WHERE E1.EMPLOYEE_ID = E2.MANAGER_ID
AND E1.EMPLOYEE_ID = J.EMPLOYEE_ID
AND E1.HIRE_DATE = J.START_DATE
GROUP BY E1.FIRST_NAME, E1.LAST_NAME, J.JOB_ID
ORDER BY TOTAL_SAL;
Index 힌트에는 인덱스명 대신 다음과 같이 컬럼명을 지정할 수 있다.
SELECT /*LEADING(E2 E1) USE_NM(E1) INDEX(E1(EMPLOYEE_ID))*/