본문 바로가기
정보관리(데이터베이스, DB)/DB

내부 조인 제거(Inner-Join Elimination) 란?

by 3604 2025. 9. 25.
728x90

 

1. 정의

쿼리 옵티마이저가 실제로 필요 없는 INNER JOIN 연산을 발견하면
SQL 문에 명시돼 있더라도 실행 계획에서 조인 단계를 아예 제거
불필요한 I/O·CPU를 줄이는 최적화 기법.

2. 제거 조건 (대표적)

  • 조인 컬럼이 PK-FK 관계이고
  • FK 쪽에 NOT NULL 제약이 있으며
  • 부모 테이블의 컬럼을 SELECT·WHERE·ORDER BY 어디에도 사용하지 않고
  • 중복-행 제거(duplicate elimination)에도 영향을 주지 않을 때
→ 옵티마이저는 "부모 테이블을 읽을 필요가 없다"고 판단하고 조인을 없앤다.

3. 간단 예시

sql
Copy
-- 부모
CREATE TABLE dept (
    dept_id  PRIMARY KEY,
    dname    VARCHAR2(30)
);

-- 자식
CREATE TABLE emp (
    emp_id      PRIMARY KEY,
    dept_id NOT NULL,          -- NOT NULL + FK
    ename       VARCHAR2(30),
    CONSTRAINT emp_dept_fk FOREIGN KEY (dept_id) REFERENCES dept(dept_id)
);

-- 쿼리
SELECT e.emp_id, e.ename
FROM   emp e
JOIN   dept d ON d.dept_id = e.dept_id;
  • dept 컬럼을 전혀 안 씀
  • e.dept_id는 NOT NULL이므로 NULL 확장 없음
→ 옵티마이저가 dept 테이블을 읽지 않고 emp만 풀-스캔으로 처리
(실행 계획에 JOIN 연산자 자체가 나타나지 않음)

4. 성능 이점

  • 블록 접근 횟수 ↓ (조인 상대 테이블 I/O 제거)
  • CPU 비용 ↓ (해시·네스티드·소트 머지 연산 없음)
  • 버퍼 캐시 효율 ↑
  • 인덱스 스캔·룩업 횟수 ↓

5. 지원 범위

  • Oracle : 10g R2 부터 지원, *_TABLES.JOIN_ELIMINATION 통계 뷰에 표시
  • PostgreSQL : 9.0+ (eliminate-simple, eliminate-outer)
  • Tibero : 6 이상(Oracle 호환 최적화 활성화 시) 동일 조건에서 적용

6. 제거되지 않는 경우

  • 부모 컬럼을 SELECT/WHERE/ORDER BY에 사용
  • FK 컬럼에 NULL 허용
  • DISTINCT, GROUP BY, 집계 등에서 부모 컬럼 참조
  • OUTER JOIN (LEFT/RIGHT/FULL) → 조인 제거 대상 아님

7. 확인 방법

sql
Copy
-- Oracle/Tibero
EXPLAIN PLAN FOR
  SELECT e.emp_id
  FROM   emp e JOIN dept d ON d.dept_id = e.dept_id;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

-- 결과에 "JE" (Join Elimination) 표시 또는 dept 테이블이 아예 없음

8. 요약

"PK-FK + NOT NULL + 부모 컬럼 미사용" 조건을 만족하면
옵티마이저가 조인 자체를 스킵해서
쿼리는 그대로이지만 실행 계획은 단일 테이블 스캔으로 바뀌는
내부 조인 제거(Inner-Join Elimination) 기술이다.
728x90