#5 Optimizer & index

jychan99·2025년 2월 25일

개념정리

목록 보기
5/22

Optimizer

옵티마이저는SQL을 빠르고 효율적으로 수행할 최적의 처리 경로를 생성해주는 DBMS 내부의 핵심 엔진이다.
옵티마이저는 데이터베이스 시스템이 효율적이고, 최적의 성능으로 동작하게 한다.

옵티마이저 동작과정

  • 사용자:SQL작성
  • Parser가 SQL문장을 파싱해서 파싱트리로 만든다.(문법검사, 구문분석)
  • 파싱된 트리에서 쿼리의미를 파악하고 최적화에 필요한 정보를 수집
  • 다양한 실행계획 후보를 생성하고 각 후보의 비용을 추정해 최적의 실행 계획을 선택함
  • 선택된 실행계획으로 쿼리를 실행하고 결과 반환

옵티마이저가 가끔 비효율적으로 실행계획을 구성 할 수가 있는데, 사용자는 힌트를 줌으로써 실행 계획을 변경 할 수 있다.

SELECT /*+ FIRST_ROWS  */ * 
FROM test
WHERE id = '10';

힌트사용법이나 구문은 따로 찾아보기..!

실행계획

실행계획을 확인하기위해서는 조회 쿼리앞에 explain을 붙여주면된다.

ex) explain select * from test

옵티마이저 튜닝시 인덱스를 줄 때는 카디널리티가 높은 칼럼에 인덱스를 할당해야한다.
즉, unique 하거나 PK에 걸어주는것이 가장 이상적이다.

단, 데이터가 수십만건정도로 많을떄만 걸어주자. 아니면 역효과가난다.

Index

테이블에 대한 검색 속도를 높여주는 자료구조.
대부분의 쿼리성능저하는 조회에서 생기므로, 조회하기 편하도록 목차를 생성하는 개념이다.

동작방식

인덱스를 생성하면, 해당 컬럼의 데이터들을 별도로 정렬하여 메모리공간에 물리적 주소와 함께 저장됨. -> DB의 약 10%저장공간을 추가로 필요로한다.

생성된 인덱스를 통해 옵티마이저가 판단하여 검색속도를 향상시키는 효과를 가져올 수 있다.

종류

인덱스는 여러 종류가 있지만, B-tree(Balanced Tree)가 가장 대표적이다.
B-tree : 양쪽 자식 노드 수의 밸런스를 유지하는 트리. 탐색 시간에 매우 효율적이나, update, insert, delete등 데이터의 변경이 발생 할 때마다 트리의 재정렬이 필요하다.

따라서, 조건절에 자주 사용되는, 카디널리티가 높은(unique하거나 PK), 데이터가 많은 테이블에 Index를 걸어줘야한다.

profile
내가 지금 두려워 하고 있는 일이 바로 내가 지금 해야 할 일이다. 🐍

0개의 댓글