4. 쿼리 튜닝의 매커니즘 이해하기 (2)

JOY·2025년 3월 19일
0

4-4, 5. 오브젝트 스캔 (1), (2)

💡 오브젝트 스캔 - Table Scan, Index Scan

  • 테이블 스캔
    • Table Full Scan (테이블 전체 접근) : 인덱스 없이 테이블에 바로 접근
  • 인덱스 스캔
    • Index Range Scan (인덱스 범위 접근)
    • Index Full Scan (인덱스 전체 접근)
    • Index Unique Scan (인덱스 고유 접근)
    • Index Loose Scan (인덱스 느슨한 접근)
    • Index Merge Scan (인덱스 병합 접근)

EMP 테이블 일부 정보

  • PK
    • EMP_ID
  • INDEX
    • I_HIRE_DATE : HIRE_DATE
    • I_GENDER_LAST_NAME : GENDER, LAST_NAME

테이블 스캔 : Table Full Scan

인덱스를 거치지 않고 테이블로 접근, 처음부터 끝까지 데이터를 접근

  • 테이블 처음~ 끝까지 모두 접근
  • Sequential Scan

→ 사용 가능한 인덱스가 없을 때
→ 데이터 대비 많은 양의 데이터를 읽어야 할 때
→ 오히려 인덱스가 비효율적일 때 등

-- Table Full Scan
SELECT emp_id, last_name, first_name
  FROM emp
 WHERE gender IS NOT NULL --해당 조건은 인덱스를 탈 수 없음

인덱스 스캔 : Index Range Scan

인덱스를 특정한 범위까지 스캔, 스캔 결과를 바탕으로 테이블의 데이터에 접근

  • BETWEEN ~ AND , < , > , <= , >= , LIKE
-- 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

인덱스만 처음부터 끝까지 스캔하는 방식

  • 테이블은 접근하지 않음
  • 인덱스 구성 컬럼만 요구하는 SQL문
  • Table Full Scan 대비 성능적으로 유리
    인덱스 자체를 모두 스캔하기에 검색범위를 줄일 수 있는지 확인 필요
-- Index Full Scan
-- type : index
SELECT last_name
  FROM emp
 WHERE gender <> 'F' --pk 인덱스를 활용하여 범위 스캔

인덱스 스캔 : Index Unique Scan

기본키(PK)나 유니크 인덱스(UI)를 통해 테이블을 스캔하는 방식

  • Where 절에 = 조건인 경우
  • 조인 컬럼 또는 조건절의 컬럼이 PK 또는 UI의 선두 컬럼으로 사용되는 경우
-- Index Unique Scan 
-- type : const
SELECT last_name
  FROM emp
 WHERE emp_id = 20000 -- pk를 활용한 Unique Scan

인덱스 스캔 : Index Loose Scan

인덱스의 필요한 부분만 골라 스캔하는 방식

  • Where절 조건문 기준으로 필요한 부분과 아닌 부분을 구분하여 선택적으로 스캔
  • Group by, Max, Min
-- 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

조건절에 인덱스의 선두 컬럼이 없어도, 선두 컬럼을 뛰어넘어 스캔을 수행하는 방식

  • (예시) 인덱스 구성 컬럼 : gender + last_name
    → where 절에 last_name 조건문 작성
-- 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 조건에 사용된 컬럼이 해당 테이블의 선두컬럼이 아니더라도 해당 컬럼을 뛰어 넘고 인덱스를 사용


인덱스 스캔 : Index Merge Scan

생성된 2개의 인덱스를 통합한 후, 테이블을 스캔하는 방식

  • where절 조건문에 서로 다른 인덱스를 구성하는 컬럼들로 구성되어 있는 경우
  • 인덱스의 결합(Union) 또는 교차(Intersection)
-- 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 조건에 서로 다른 인덱스에 대한 구성 컬럼이 모두 포함 & 각 인덱스 활용

profile
Just Do IT ------- 🏃‍♀️

0개의 댓글