Paging 처리할 때 Join 전 먼저 Paging 처리하여 Join 부하 감소
페이징 쿼리(ROWNUM <= N) 에서 후행 테이블이 결과 건수에 영향을 미치지 않는다면, 선행 테이블에서 페이징을 먼저 수행한 뒤 후행 테이블을 join 하는 것이 압도적으로 빠릅니다. 핵심 정리 원리: 후행 테이블과 join 해도 결과 건수에 차이가 없다면, 선행 테이블에서 페이징(ROWNUM <= N + STOPKEY) 을...
Join Predicate Push Down(JPPD)
JPPD (Join Predicate Push-Down) 는 옵티마이저가 선행 테이블의 join predicate 를 후행 VIEW 안쪽으로 밀어 넣어, VIEW 가 결과집합을 만드는 시점에 미리 좁히는 변환입니다. 본 글은 자동 JPPD 와 수동 LATERAL 재작성을 같은 쿼리에서 비교하며, 결과적으로 VIEW 가 LATERAL view 처럼 동작...
Join Predicate Push Down(JPPD) 는 UNION ALL & UNION VIEW 가 있을 때 가능
선행 테이블과 후행 집합이 NESTED LOOPS JOIN 으로 수행될 때, 후행 집합이 Inline View / View 면 옵티마이저는 join predicate 를 그 안으로 push down 하여(JPPD) 인덱스 액세스 경로를 만듭니다. UNION ALL VIEW 는 그 6가지 발생 조건 중 하나입니다. 핵심 정리 JPPD 발생 조...
Join Predicate Push Down (JPPD) 는 Semi Join 상황에도 SubQuery 에 침투 가능
EXISTS 서브쿼리가 UNNEST 로 평탄화되어 SEMI JOIN 으로 풀릴 때도 JPPD 가 동작합니다. Unnest → Semi 변환 → JPPD 의 3단 변환 순서, 그리고 Predicate Information 위치로 push 여부를 판별하는 법을 정리합니다.
Join Predicate Push Down (JPPD) 는 Group By 가 있는 View 도 침투 가능 (2)
외부 GROUP BY + 인라인 뷰 GROUP BY 의 2단 집계 패턴에서도 JPPD 가 동작합니다. ORDERS 의 20 행이 인라인 뷰 안으로 한 행씩 밀려 들어가 SORT GROUP BY 가 부서당 124 행만 다루도록 압축되는 예시입니다.
Join Predicate Push Down (JPPD) 는 Group By 가 있는 View 도 침투 가능 (1)
GROUP BY 가 있는 인라인 뷰에도 외부 조인 술어를 뷰 안으로 밀어 넣을 수 있습니다. LATERAL 서브쿼리로 재작성하면 옵티마이저가 d.department_id 단위로 서브쿼리를 실행하므로, 원본의 GROUP BY 키 e.department_id 가 통째로 사라집니다.
HASH Semi Join
1:N 조인 후 1쪽 컬럼만 DISTINCT 로 추리는 패턴은 HASH JOIN + HASH UNIQUE 두 단계로 분해됩니다. EXISTS + UNNEST + HASH_SJ 로 HASH JOIN SEMI 를 유도하면 두 단계가 하나로 합쳐져 PGA 사용량과 처리 행 수가 모두 감소합니다.
HASH JOIN 에 SWAP_JOIN_INPUTS 사용
HASH JOIN 의 빌드 입력(Driving) 결과 집합이 후행 테이블보다 크면 메모리·CPU 가 낭비됩니다. SWAP_JOIN_INPUTS 힌트로 빌드/프로브 순서를 뒤집어 1 건짜리 작은 집합을 해시 테이블로 만들면 비용이 크게 줄어듭니다.
HASH JOIN 시 Left Deep Plan 이 안될 때 Bushy Tree Plan 유도
4-way HASH JOIN 의 Left Deep Tree 플랜에서 똑똑한 필터(N1<50) 가 트리 끝쪽 T1 에 박혀 있어 매번 1만 건 해시 영역이 만들어집니다. 두 inline view 로 쪼개 Bushy Tree 로 유도하면 똑똑한 필터가 한쪽 가지 안에서 먼저 적용되어 PGA 사용량이 절반 수준으로 떨어집니다.
Group By Push Down
Parallel Query 에서 GROUP BY 를 슬레이브 단에서 미리 수행해 Table Queue 로 전달되는 데이터 건수를 줄이는 변환입니다. GBY_PUSHDOWN 힌트로 선 GROUP BY → 후 GROUP BY 두 단계로 분리되어 일량이 감소합니다.