728x90
1. 정의
쿼리 옵티마이저가 실제로 필요 없는 INNER JOIN 연산을 발견하면
SQL 문에 명시돼 있더라도 실행 계획에서 조인 단계를 아예 제거해
불필요한 I/O·CPU를 줄이는 최적화 기법.
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 연산자 자체가 나타나지 않음)
(실행 계획에 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) 기술이다.
옵티마이저가 조인 자체를 스킵해서
쿼리는 그대로이지만 실행 계획은 단일 테이블 스캔으로 바뀌는
내부 조인 제거(Inner-Join Elimination) 기술이다.
728x90
'정보관리(데이터베이스, DB) > DB' 카테고리의 다른 글
| [Join] ANSI Join & Oracle Join, Join의 종류 (0) | 2025.09.26 |
|---|---|
| 참조 무결성 룩업이 사라지는 것, 1:1/1:N 매핑 보장이 사라지는 것, transitive predicate 생성이 안 된다는 것 (0) | 2025.09.26 |
| 외부에서 생성한 테스트 인덱스, 중복 인덱스, 오래된 인덱스 등 삭제 가능 인덱스 전체 조회 쿼리 (0) | 2025.09.25 |
| 인덱스 튜닝 방법 (0) | 2025.09.25 |
| tibero에서 데이터를 많이 저장할 수록 왜 인덱스가 증가할까? 조회한 인덱스를 계속 저장하나? (0) | 2025.09.25 |