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
를 활용하여 튜닝할 수 있습니다!
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…