[Computer Science][Database] DB 성능의 숨은 영웅, 옵티마이저의 모든 것!

김상욱·2024년 10월 12일
post-thumbnail

💡 옵티마이저(Optimizer)에 대해 알아보자!

옵티마이저(Optimizer)는 SQL 쿼리를 최적화하여 가장 효율적인 실행 계획을 수립하는 DBMS의 핵심 요소입니다. 사용자가 작성한 SQL 쿼리를 분석하고, 여러 실행 계획 중에서 가장 빠르고 적은 자원을 사용하는 방법을 선택해 쿼리를 실행하게 도와줍니다.

🎯 옵티마이저의 역할

  1. 쿼리 실행 계획 수립
    옵티마이저는 SQL 쿼리를 해석한 후, 데이터를 조회하는 여러 방법을 고려하여 최적의 실행 계획(Execution Plan)을 수립합니다.

  2. 성능 최적화
    옵티마이저는 테이블 스캔, 인덱스 사용, JOIN 순서 등을 선택하여 쿼리가 빠르게 실행되도록 최적화합니다. 필요한 메모리, 디스크 I/O, CPU 등의 자원을 고려해 효율적인 자원 사용을 추구합니다.

  3. 통계 정보 활용
    옵티마이저는 테이블의 통계 정보(Statistics)를 활용하여 실행 계획을 세웁니다. 이 통계 정보에는 테이블의 행 수, 인덱스 분포도, 컬럼의 유니크 값 등이 포함됩니다. 이를 통해 어떤 접근 방식이 가장 빠를지를 예측합니다.

옵티마이저의 종류 🤔

1. 규칙 기반 옵티마이저(RBO)

  • 고정된 규칙에 따라 쿼리의 실행 계획을 수립합니다. 예를 들어, 항상 인덱스를 우선 사용하거나 테이블 스캔을 선호하는 등의 규칙이 있습니다.
  • 최신 DBMS에서는 많이 사용되지 않으며, CBO가 대부분의 시스템에서 사용됩니다.

2. 비용 기반 옵티마이저(CBO)

  • 통계 정보비용 모델을 바탕으로 실행 계획을 수립합니다.
  • 각 실행 계획에 대해 비용(Cost)을 계산하며, 비용이 가장 낮은 경로를 선택합니다. 비용에는 디스크 I/O, CPU 사용량, 메모리 사용량 등이 포함됩니다.
  • 예: 특정 쿼리에서 인덱스를 사용하는 것이 빠를지, 전체 테이블 스캔이 더 적은 비용일지를 판단하여 효율적인 방법을 선택합니다.

옵티마이저가 고려하는 요소들 💡

  1. 테이블 스캔 또는 인덱스 스캔
    옵티마이저는 인덱스를 사용할지, 전체 테이블을 스캔할지 결정합니다. 작은 테이블은 테이블 스캔이 빠르고, 큰 테이블에서는 인덱스 스캔이 효율적일 수 있습니다.

  2. JOIN 순서 및 방법
    여러 테이블을 JOIN할 때, 어떤 테이블을 먼저 조회할지 결정합니다. 또한 Nested Loop, Hash Join, Merge Join 등 여러 JOIN 알고리즘 중에서 가장 효율적인 방법을 선택합니다.

  3. 필터 조건과 통계 정보
    옵티마이저는 WHERE 조건을 분석해 어떤 데이터가 많이 걸러질지를 예측하며, 통계 정보를 바탕으로 적절한 실행 계획을 세웁니다. 조건에 맞는 데이터가 적다면 인덱스를 사용하지만, 많다면 전체 테이블 스캔을 선택할 수 있습니다.

  4. 서브쿼리 최적화
    서브쿼리를 포함한 쿼리에서는 옵티마이저가 서브쿼리를 반복적으로 실행할지, 메인 쿼리와 병합(Merge)할지를 결정합니다.

옵티마이저 힌트 (Optimizer Hint)로 최적화 지시하기 💬

때로는 옵티마이저가 최적의 실행 계획을 선택하지 못할 수도 있습니다. 이럴 때는 힌트(Hint)를 사용하여 옵티마이저에게 특정 방식으로 실행하도록 지시할 수 있습니다.

SELECT /*+ INDEX(employees idx_employee_name) */ *
FROM employees
WHERE employee_name = 'Alice';

위 쿼리는 옵티마이저에게 employees 테이블의 idx_employee_name 인덱스를 사용하도록 지시하는 힌트를 포함하고 있습니다.

옵티마이저의 한계 😅

  1. 부정확한 통계: 옵티마이저가 사용하는 통계 정보가 오래되거나 부정확할 경우, 잘못된 실행 계획을 선택할 수 있습니다. 이를 방지하기 위해 정기적인 통계 업데이트가 필요합니다.

  2. 복잡한 쿼리: 너무 복잡한 쿼리는 옵티마이저가 최적의 경로를 찾는 데 어려움을 겪을 수 있습니다. 이 경우, 쿼리 리팩토링이 필요할 수 있습니다.


정리

  • 옵티마이저(Optimizer)는 SQL 쿼리의 실행 계획을 수립하고, 가장 효율적인 방법을 선택하는 DBMS의 핵심 요소입니다.
  • 비용 기반 옵티마이저(CBO)가 주로 사용되며, 통계 정보와 비용을 기준으로 실행 계획을 수립합니다.
  • 옵티마이저는 테이블 스캔, 인덱스 사용, JOIN 방식 등을 결정하며, 사용자는 필요 시 힌트(Hint)를 통해 옵티마이저의 결정을 수정할 수 있습니다.

옵티마이저의 효율적인 사용은 데이터베이스 성능 최적화의 핵심입니다! 😊

0개의 댓글