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

JOY·2025년 3월 19일
0

4-1. 드라이빙 테이블 vs 드리븐 테이블

💡 테이블에 접근하는 선후 관계

  • 테이블 접근 우선 순위
  • 먼저 접근 하는 테이블 : 드라이빙(Driving) 테이블 (Outer Table)
  • 나중 접근 하는 테이블 : 드리븐(Driven) 테이블 (Inner Table)
SELECT emp.EMP_ID, emp.FIRST_NAME, emp.LAST_NAME, grade.GRADE_NAME
  FROM grade -- 직급
	JOIN emp   -- 사원
	  ON grade.EMP_ID = emp.EMP_ID
 WHERE emp.LAST_NAME = 'Suri' 
 -- where → on

👌 드라이빙 테이블에 추출된 결과가 적을 수록 성능상 유리

→ 드리븐 테이블에 인덱스가 존재할 경우 더 성능상 빠름

드라이빙 테이블이 중요한 이유

  • 성능에 중요하게 미치는 것 → 규모가 작은 테이블

    • 규모가 작은 드라이빙 테이블 “작은 스캔
      → “인덱스 접근을 통한 드리블 테이블 접근
      (조인 조건을 바탕으로 인덱스 생성)
  • 인덱스 : 테이블의 레코드 접근 범위를 줄여줄 수 있는 오브젝트

드라이빙 테이블이 선택되는 조건

예시) A - emp 테이블 / B - grade 테이블

  1. A(인덱스+테이블) → B(인덱스+테이블)
  2. A(테이블) → B(인덱스+테이블)
  3. B(테이블) → A(인덱스+테이블)
  4. A(테이블) → B(테이블) : 튜닝 대상 / 조인 조건 존재 시 , 조인 컬럼에 대한 튜닝

4-2. 조인 알고리즘(Nested Loop Join)

💡 물리적인 스토리지에 저장되어있는 데이터를 접근 하는 방식
→ Random Access(임의접근) 과 Sequential Access(순차접근)

  • 레코드가 모여있는 페이지라는 단위로 스토리지에 접근
    • 페이지 : 데이터 검색 시 사용하는 최소 단위
  • Random Access (임의접근)
    → 임의로 페이지 읽기
    ❗ 인덱스 존재 시, 순차적 인덱스로 접근 하지만 테이블에는 정렬이 되지 않은 데이터가 존재할 수 있기 때문에 비효율적이며 튜닝의 대상이 되기도 한다.
  • Sequential Access (순차접근)
    → 인접한 페이지를 차례대로 읽기 (테이블을 순차적으로 읽기)

조인 알고리즘 유형

  • Nested Loop Join
  • Hash Join
  • Sort Join (Oracle만 해당)

Nested Loop Join

인덱스를 활용하여 Landom Access

Q. 학번이 1, 100 인 학생에 대해서 모든 비상연락망 목록을 출력하세요.

WHERE 학생.학번 = 비상연락망.학번
  AND 학생.학번 IN (1, 100)
  • 극단적인 NL Join ( 인덱스 미존재 )
    • 드라이빙 테이블 : 학생 테이블

    • 드리븐 테이블 : 비상연락망 테이블

      👉 for 학생 for 비상연락망 학생.학번 == 비상연락망.학번

  • 일반적인 NL Join ( 조인 컬럼 인덱스 모두 존재 )

4-3. 조인 알고리즘(Hash)

실습

--쿼리 1
SELECT emp.EMP_ID, emp.FIRST_NAME, emp.LAST_NAME, grade.GRADE_NAME
  FROM grade, emp 
 WHERE emp.LAST_NAME = 'Suri' 
	  ON grade.EMP_ID = emp.EMP_ID

→ 실행 계획 수행 시,
Extra - Using where 로 표기 : Nested Loop Join 사용

--쿼리 2
SELECT emp.EMP_ID, emp.FIRST_NAME, emp.LAST_NAME, grade.GRADE_NAME
  FROM grade, emp 

→ 실행 계획 수행 시,
Extra - Using Index, Using Join buffer(Hash Join)로 표기 : Hash Join 사용

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

0개의 댓글