SQL 및 옵티마이저
SQL은 구조화되고 집합적이며 선언적인 쿼리 언어입니다.
⇒ 선언 및 결과 얻기 이 과정에서 옵티마이저는 쿼리를 최적으로 수행하기 위해 각 테이블의 데이터 분포를 참조하고 데이터를 기반으로 최적의 실행 계획을 생성합니다.
SQL 최적화 프로세스 분석
- SQL 구문 분석 – SQL 구문 분석기가 구문 분석을 수행합니다.
- 구문 분석 트리 생성 – SQL 문의 개별 구성 요소를 분석하여 구문 분석 트리를 생성합니다.
- 구문 검사 – 문법 오류가 없는지 확인합니다.
- Semantic Check – 의미 오류가 없는지 확인
- SQL 최적화 – 옵티마이저가 역할 수행
- 서로 다른 실행 경로를 생성하고 비교한 후 가장 효율적인 경로를 선택합니다. – DB 성능의 핵심
- 원시 소스 생성
- SQL 옵티마이저가 선택한 실행 경로를 실제로 실행 가능한 코드나 프로시저로 포맷하는 단계입니다.
SQL 옵티마이저
효율적으로 수행할 수 있는 최적의 데이터 접근 경로를 선택하는 DBMS의 핵심 엔진
- 쿼리를 실행하기 위한 후보인 가능한 실행 계획을 찾습니다.
- 객체 통계 및 시스템 통계 정보를 이용하여 실행 계획별 예상 비용 계산
- 가장 낮은 비용을 나타내는 실행 계획을 선택하십시오.
실행 계획 및 비용
실행 계획은 사용자가 검토할 수 있도록 옵티마이저가 생성한 프로세스를 나타냅니다.
// 오라클에서 플랜
set autotrace traceonly exp;
select * from category;
explain
select * from LiveCommerceJpa.category
옵티마이저가 특정 실행 계획을 선택하는 이유는 무엇입니까?

explain
select * from
broadcast b
left outer join store s on b.store_id = s.id
where b.store_id = 7;
옵티마이저 노트
개발자가 직접 통계 정보에 담을 수 없는 데이터나 업무 특성을 이용하여 보다 효율적인 접근 경로를 찾기 위해 사용
MYSQL에는 1. 인덱스 힌트와 2. 최적화 힌트가 있습니다.
인덱스 노트
// 테이블이 조인되는 경우 조인 순서를 고정하는 역할
SELECT /*! STRAIGHT_JOIN */
*
FROM account a, store s
WHERE a.store_id=s.id
// use index, force index ignore index
SELECT /*+ USE INDEX(index_name) */
*
FROM account a, store s
WHERE a.store_id=s.id
힌트를 작성할 때 철저히 설명해야 합니다.