NO_UNNEST 힌트는 서브쿼리(Subquery)의 변환(UNNESTING) 최적화를 방지하는 데 사용됩니다. NEST의 사전적 의미는 무언가를 “포개다, 겹치다”의 의미로 중첩을 의미합니다. 서브쿼리에 unnest 힌트를 사용하게 되면, 서브쿼리를 펴서 메인쿼리와 조인으로 풀어내겠다는 의미로 보시면 됩니다. no_unnest는 중첩을 풀지 않고 필터조건으로 풀어내는 것으로 보면 됩니다.
NO_UNNEST 힌트를 사용합니다.※ /*+ unnest */ : 서브쿼리를 unnesting 함으로써 JOIN 방식으로 최적화하도록 유도
/*+ no_unnest */ : 서브쿼리를 둔 상태에서 필터 방식으로 최적화하도록 유도
JOIN 변환을 수행하는 경우✅ NO_UNNEST 힌트를 사용하면 옵티마이저가 서브쿼리를 변환하지 않고 원래 형태로 유지함.
아래와 같은 서브쿼리는 Oracle에서 자동으로 JOIN으로 변환될 수 있음.
SELECT e.employee_id, e.first_name
FROM employees e
WHERE e.department_id IN (SELECT d.department_id FROM departments d WHERE d.location_id = 1700); NO_UNNEST 힌트를 사용하면 서브쿼리를 유지하도록 강제할 수 있음.
SELECT /*+ NO_UNNEST */ e.employee_id, e.first_name
FROM employees e
WHERE e.department_id IN (SELECT d.department_id FROM departments d WHERE d.location_id = 1700); | 상황 | 기본 동작 (Unnesting O) | NO_UNNEST 적용 시 (Unnesting X) |
|---|---|---|
| IN 서브쿼리 | 서브쿼리를 SEMI JOIN으로 변환 | 서브쿼리를 그대로 유지 |
| EXISTS 서브쿼리 | ANTI JOIN 등으로 변환 | EXISTS 형태 유지 |
| SCALAR 서브쿼리 | OUTER APPLY (LATERAL) 등으로 변환 | 서브쿼리 그대로 유지 |
| 뷰(View) 내부 서브쿼리 | 뷰 내부 서브쿼리를 조인으로 변환 | 서브쿼리를 분리된 상태로 유지 |
✅ JOIN 변환이 과도하게 발생하여 성능 저하되는 경우
✅ SEMI JOIN / ANTI JOIN보다 서브쿼리가 유리한 경우
IN 또는 EXISTS 서브쿼리를 유지하는 것이 더 효율적일 때.✅ 뷰(View) 내부에서 서브쿼리 유지가 필요한 경우
| 힌트 | 설명 |
|---|---|
| NO_UNNEST | 서브쿼리의 UNNESTING을 방지 |
| UNNEST | 서브쿼리를 반드시 UNNESTING 수행 |
| NO_MERGE | 뷰 병합을 방지 (뷰 내부 서브쿼리를 유지하는 데 유용) |
| PUSH_SUBQ | 서브쿼리를 먼저 실행하도록 강제 |
| NO_PUSH_SUBQ | 서브쿼리의 푸시다운을 방지 |
NO_UNNEST 힌트는 옵티마이저가 서브쿼리를 JOIN으로 변환하지 않고 원래 상태로 유지하도록 강제하는 기능.🚀 옵티마이저가 서브쿼리를 자동 변환할 때 성능이 저하된다면, NO_UNNEST를 활용하여 튜닝할 수 있습니다!
이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…
오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…
10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…
삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…
주 52시간 상한이 기업 성과에 어떤 영향을 줬는지를 다룬 KDI(한국개발연구원) 연구 내용이 10월 14일 국회를…
어제 코스피는 장 초반 6,062선까지 올랐다가 결국 6,000선 턱걸이로 마감했습니다. 다들 미국 소비자물가지수(CPI) 발표만 쳐다보던…