💡 오브젝트 스캔 - Table Scan, Index Scan
EMP 테이블 일부 정보
인덱스를 거치지 않고 테이블로 접근, 처음부터 끝까지 데이터를 접근
→ 사용 가능한 인덱스가 없을 때
→ 데이터 대비 많은 양의 데이터를 읽어야 할 때
→ 오히려 인덱스가 비효율적일 때 등
-- Table Full Scan
SELECT emp_id, last_name, first_name
FROM emp
WHERE gender IS NOT NULL --해당 조건은 인덱스를 탈 수 없음
인덱스를 특정한 범위까지 스캔, 스캔 결과를 바탕으로 테이블의 데이터에 접근
-- Index Range Scan
-- type : range
SELECT emp_id, last_name, first_name
FROM emp
WHERE emp_id BETWEEN 20000 AND 30000 --pk 인덱스를 활용하여 범위 스캔
인덱스만 처음부터 끝까지 스캔하는 방식
-- Index Full Scan
-- type : index
SELECT last_name
FROM emp
WHERE gender <> 'F' --pk 인덱스를 활용하여 범위 스캔
기본키(PK)나 유니크 인덱스(UI)를 통해 테이블을 스캔하는 방식
=
조건인 경우-- Index Unique Scan
-- type : const
SELECT last_name
FROM emp
WHERE emp_id = 20000 -- pk를 활용한 Unique Scan
인덱스의 필요한 부분만 골라 스캔하는 방식
-- Index Loose Scan
-- type : range(범위 기반)
-- Extra : Using where; Using Index for group-by
SELECT gender, COUNT(distinct last_name) cnt
FROM emp
WHERE gender = 'F'
Group By gender
조건절에 인덱스의 선두 컬럼이 없어도, 선두 컬럼을 뛰어넘어 스캔을 수행하는 방식
-- Index Skip Scan
-- type : range(범위 기반)
-- Extra : Using where; Using Index for skip-scan
SELECT MAX(emd_id) max_emp_id
FROM emp
WHERE last_name = 'Peha' -- 'gender' 선두컬럼 인덱스가 존재해도 사용 X
→ where 조건에 사용된 컬럼이 해당 테이블의 선두컬럼이 아니더라도 해당 컬럼을 뛰어 넘고 인덱스를 사용
생성된 2개의 인덱스를 통합한 후, 테이블을 스캔하는 방식
-- Index Merge Scan
-- type : index_merge
-- key : I_HIRE_DATE, PRIMARY
-- Extra : Using sort_union
SELECT emd_id, last_name, first_name
FROM emp
WHERE (hire_date BETWEEN '1989-01-01' AND '1989-06-30') --index
OR emd_id > 600000 --pk
→ Where 조건에 서로 다른 인덱스에 대한 구성 컬럼이 모두 포함 & 각 인덱스 활용