📦
signature-hyeon's tech blog
  • Intro
  • TECH
    • DATABASE
      • MongoDB
    • DEVOPS
      • 배포 전략 (Rolling, Blue/Green, Canary)
    • BACKEND
      • “왜 이렇게 느려?”를 마주했을 때
      • Resilience4j CircuitBreaker
  • STUDY
    • ELASTICSEARCH
      • Elasticsearch 란?
      • 색인과 검색 원리
    • 클린 코드
      • 3장 함수
    • 친절한 SQL 튜닝
      • 1장 SQL 처리 과정과 I/O
      • 2장 인덱스 기본
      • 3.3장 인덱스 스캔 효율화
      • 4.2장 소트 머지 조인
      • 4.3장 해시 조인
      • 5장 소트 튜닝
      • 5.4장 Sort Area 효율적으로 쓰는 SQL 작성법
      • 7장 SQL 옵티마이저
Powered by GitBook
On this page
  1. STUDY
  2. 친절한 SQL 튜닝

7장 SQL 옵티마이저

친절한 SQL 튜닝 7장

Previous5.4장 Sort Area 효율적으로 쓰는 SQL 작성법

Last updated 23 days ago

CtrlK
  • SQL 옵티마이저란?
  • 옵티마이저의 종류
  • 옵티마이저의 핵심 요소
  • 왜 SQL 튜닝에서 옵티마이저를 알아야 할까?
  • 통계 불일치가 일어나는 경우가 있을까?
  • 옵티마이저도 완벽하지 않다 (그래서 개발자가 필요하다)
  • 튜닝 전문가 되는 공부 방법
  • 정리

SQL 옵티마이저란?

사용자가 작성한 SQL을 가장 효율적인 실행계획으로 변환하는 데이터베이스의 핵심 엔진이다. 쿼리를 그대로 실행하지 않고 옵티마이저가 여러 실행 방법 중 가장 빠를 것으로 예상되는 계획을 선택한다.

옵티마이저의 종류

규칙 기반 옵티마이저 (RBO, Rule-Based Optimizer)

  • 오래된 방식, 미리 정해진 우선순위에 따라 실행 계획을 결정함.

  • ex. 인덱스를 쓰는 것이 항상 테이블 풀 스캔보다 먼저

비용 기반 옵티마이저 (CBO, Cost-Based Optimizer)

  • 통계 정보를 기반으로 각 실행 계획의 비용을 계산하여 가장 낮은 비용을 선택

  • 요즘 DB는 대부분 CBO 사용 중

  • 통계 정보(테이블 건수, 인덱스 카디널리티 등)가 매우 중요함

옵티마이저의 핵심 요소

  1. 통계 정보: 테이블/인덱스 건수, 데이터 분포, 컬럼 값 범위 등 사용

  2. 비용 모델: 실행 계획마다 예상되는 리소스 사용량(디스크 i/o, cpu 소모 등)을 숫자로 계산하여 가장 낮은 비용의 실행 계획 선택

  3. 힌트: 옵티마이저의 선택을 강제할 수 있는 수단

왜 SQL 튜닝에서 옵티마이저를 알아야 할까?

  • 실행 계획은 SQL 성능에 직결됨.

  • 옵티마이저가 잘못된 계획을 세우는 경우(통계 불일치, 편향된 데이터 분포 등)가 많음.

  • 따라서 SQL 튜닝 시

    1. 옵티마이저가 어떤 기준으로 판단했는지

    2. 통계 정보가 정확한지

    3. 힌트나 구조 변경이 필요한지

를 판단해야 한다.

통계 불일치가 일어나는 경우가 있을까?

데이터베이스에서 자동으로 통계를 수집하는건 맞지만, 다음과 같은 상황에서 통계가 부정확해질 수 있다.

  • 대량의 데이터 변경 후 통계가 아직 갱신되지 않은 경우

  • 데이터 분포가 특이한 경우

이 경우 통계를 갱신할 수 있는데, ANALYZE TABLE 또는 DBMS_STATS 명령어로 갱신할 수 있다.

  • ANALYZE TABLE: 인덱스 키 분포를 분석하고, 통계 정보를 업데이트한다. (MySQL)

ANALYZE TABLE table_name;

갑자기 슬로우 쿼리가 발생하는 데에는 여러 가지 이유가 있을 수 있다.

그중 하나는 통계가 갱신되지 않아 옵티마이저가 정상적으로 동작하지 못하는 경우다. 백엔드 개발자도 이러한 상황이 발생할 수 있음을 알아두는 것이 좋겠다.

옵티마이저도 완벽하지 않다 (그래서 개발자가 필요하다)

최적의 실행 계획을 계산하기 위해 완벽한 통계 정보를 얻는 것은 힘들다. 옵티마이저는 결국 사람이 만든 로직이므로 개발자의 개입이 필요하다.

개발자가 할 수 있는 최적화 팁

  • 필요한 최소 블록만 읽도록 SQL 작성 (불필요한 함수/조인/컬럼 접근 최소화)

  • 조건절 기준으로 인덱스 전략적으로 구성 (파티션, 클러스터, IOT 활용)

  • 필요하면 힌트 명시

튜닝 전문가 되는 공부 방법

보통 아래 세 가지로 나뉜다.

  • SQL 튜닝: I/O 최적화, DB Call 최적화, SQL 파싱 최적화

  • DB 설계: 논리적 데이터 구조 설계, 물리적 저장 구조 설계

  • 인스턴스 튜닝: Lock/Latch 모니터링 및 해소, 메모리 설정, 프로세스 설정 등

튜닝 전문가가 되려면 SQL을 깊이 이해하고, 좋은 데이터 구조를 설계하는 것이 가장 중요하다.

정리

  • 옵티마이저는 SQL 성능의 핵심: 어떤 실행 계획을 선택하는가?

  • 통계 정보가 정확해야 옵티마이저가 올바른 선택을 한다.

  • 옵티마이저의 의사결정 요소(비용, 조인 순서, 인덱스 사용)를 이해하면 SQL 튜닝이 쉬워짐.