1페이지. SQL 처리 프로세스 및 IO – SQL 분석 및 최적화

SQL 및 옵티마이저


SQL은 구조화되고 집합적이며 선언적인 쿼리 언어입니다.

⇒ 선언 및 결과 얻기 이 과정에서 옵티마이저는 쿼리를 최적으로 수행하기 위해 각 테이블의 데이터 분포를 참조하고 데이터를 기반으로 최적의 실행 계획을 생성합니다.

SQL 최적화 프로세스 분석


  1. SQL 구문 분석 – SQL 구문 분석기가 구문 분석을 수행합니다.
    1. 구문 분석 트리 생성 – SQL 문의 개별 구성 요소를 분석하여 구문 분석 트리를 생성합니다.
    2. 구문 검사 – 문법 오류가 없는지 확인합니다.
    3. Semantic Check – 의미 오류가 없는지 확인
  2. SQL 최적화 – 옵티마이저가 역할 수행
    1. 서로 다른 실행 경로를 생성하고 비교한 후 가장 효율적인 경로를 선택합니다. – DB 성능의 핵심
  3. 원시 소스 생성
    1. SQL 옵티마이저가 선택한 실행 경로를 실제로 실행 가능한 코드나 프로시저로 포맷하는 단계입니다.

SQL 옵티마이저


효율적으로 수행할 수 있는 최적의 데이터 접근 경로를 선택하는 DBMS의 핵심 엔진

  1. 쿼리를 실행하기 위한 후보인 가능한 실행 계획을 찾습니다.
  2. 객체 통계 및 시스템 통계 정보를 이용하여 실행 계획별 예상 비용 계산
  3. 가장 낮은 비용을 나타내는 실행 계획을 선택하십시오.

실행 계획 및 비용


실행 계획은 사용자가 검토할 수 있도록 옵티마이저가 생성한 프로세스를 나타냅니다.

// 오라클에서 플랜
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

힌트를 작성할 때 철저히 설명해야 합니다.