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를 활용하여 튜닝할 수 있습니다!
1. 타입스크립트 개요 타입스크립트(TypeScript)는 마이크로소프트(Microsoft)가 개발한 자바스크립트(JavaScript)의 상위 집합(Superset) 언어입니다.즉, 자바스크립트에 정적 타입(Static Type)을 추가하고,…
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…