[SQL] 실행계획

golony·2022년 4월 4일
0

개발

목록 보기
7/23

실행계획

  • 옵티마이저가 수립하는 쿼리의 실행 계획

SCAN

  • 테이블에서 데이터를 읽는 과정

Index Unique Scan

  • 인덱스에서 하나의 블록을 읽어, 테이블의 특정 컬럼에 접근

Index Range Scan

  • 인덱스에서 하나의 블록을 읽고, 해당 지점으로 부터 필요한 지점까지 접근
  • Full ScanRange Scan으로 유도함으로써 속도 개선 가능

Full Scan

  • 테이블의 모든 레코드를 처음부터 끝까지 읽음

JOIN

  • scan으로 읽은 데이터를 Join 하는 과정

NESTED LOOP JOIN (NL JOIN)

  • 두 집합 중 하나를 기준으로 삼고, 나머지 집합과 순차적으로 상대방 집합과 연결
  • 개발 언어의 이중 반복문과 유사한 상황

Driving Table & Driven Table

  • 입사하고 쿼리속도 이슈가 생겼을때 처음으로 배운 개념
  • Driving Table: Nested Loop Join에서 먼저 접근하는 (==기준이 되는) 테이블
  • Driven Table: 나중에 접근되는 테이블. (위 설명의 상대방 집합에 해당)
  • 둘 중 레코드 수가 적은 테이블을 Driving Table로 지정하는 것이 좋음

잠깐... 이중 반복문이라면서?

  • 초반에 햇갈린 개념. 큰게 먼저오나, 작은게 먼저오나 똑같은 것이 아닌가 하는 생각이었다.

Full Scan이라면 동일하겠지만, 인덱스를 탄다면 Driven Table에서 대상 레코드를 찾는데 드는 비용이 O(n)이 아니니까 결과적으로 정직하게 O(n^2)이 되지는 않는다

Hash Join

  • JOIN 컬럼에 적절한 Index가 없는 경우 사용하는 Join
  • Hash Table을 생성 => 메모리 크기에 영향을 받음

과정

  1. Join되는 두 테이블 중 작은 테이블로 Hash Table 생성
  2. 다른 테이블을 읽어 생성된 Hash Table로 JOIN (Hash Table을 인덱스로 사용)

SORT MERGE JOIN

  • 인덱스가 전혀 없는 경우 사용하는 Join
  • 모든 레코드를 읽음 => I/O 속도에 영향을 받음

과정

  1. 두 테이블을 모두 읽어, JOIN 컬럼을 기준으로 정렬
  2. 정렬 결과를 토대로 JOIN

참고자료

profile
더 나은 세상으로 나아가는 서비스를 만들고 싶습니다.

0개의 댓글