실행계획
SCAN
Index Unique Scan
- 인덱스에서 하나의 블록을 읽어, 테이블의 특정 컬럼에 접근
Index Range Scan
- 인덱스에서 하나의 블록을 읽고, 해당 지점으로 부터 필요한 지점까지 접근
Full Scan
을 Range 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
을 생성 => 메모리 크기에 영향을 받음
과정
- Join되는 두 테이블 중 작은 테이블로
Hash Table
생성
- 다른 테이블을 읽어 생성된
Hash Table
로 JOIN (Hash Table을 인덱스로 사용)
SORT MERGE JOIN
- 인덱스가 전혀 없는 경우 사용하는 Join
- 모든 레코드를 읽음 => I/O 속도에 영향을 받음
과정
- 두 테이블을 모두 읽어, JOIN 컬럼을 기준으로 정렬
- 정렬 결과를 토대로 JOIN
참고자료