UNNEST SUBQUERY

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 기본 정보

[편집] Parameter 정보


Syntax _UNNEST_SUBQUERY
설정방법
  • Parameter File
  • ALTER SYSTEM SET "_UNNEST_SUBQUERY" = TRUE|FALSE
  • ALTER SESSION SET "_UNNEST_SUBQUERY" = TRUE|FALSE
버전 및 기본값
9iR2 10gR1 10gR2 11g
TRUE TRUE TRUE TRUE



[편집] 설명

_UNNEST_SUBQUERY 파라미터는 Subquery Unnesting여부를 결정한다. Subquery Unnesting이란 말 그대로 Subquery를 Unnest, 즉 쿼리안으로 풀어버리는 것을 의미한다.

[편집] 참고 사항

[편집] Subquery Unnesting의 적용 예

Subquery Unnesting의 적용 예는 아래와 같다.

-- Subquery를 사용하는 쿼리
SELECT * 
 FROM orders 
 WHERE customer_id IN 
   (SELECT customer_id FROM customers); 
 
-- Subquery Unnesting에 의해 변환된 쿼리. Subquery가 쿼리 본문안으로 풀어졌음을 알 수 있다.
 SELECT orders.* 
 FROM orders, customers 
 WHERE orders.customer_id = customers.customer_id;

[편집] 잘못된 Subquery Unnesting에 의한 성능 저하

Subquery Unnesting은 대단히 바람직한 기능이며, 일반적으로 성능을 개선시키는 효과가 있다. 하지만 특정 쿼리에서, 특히 복잡한 쿼리에서는 오히려 잘못된 실행 계획을 만드는 역효과를 가지고 있다. 이 경우에는 Subquery Unnesting을 비활성화함으로써 문제를 해결할 수 있다. 다음과 같은 방법으로 비활성화할 수 있다.

-- _UNNEST_SUBQUERY 파라미터를 False로 변경한다.
ALTER SESSION SET "_UNNEST_SUBQUERY" = FALSE;
SELECT * FROM (SELECT ... FROM b) x WHERE a = '100';

-- NO_UNNEST 힌트를 사용한다. 
SELECT * FROM (SELECT /*+ NO_UNNEST */ FROM b) x WHERE a = '100';


[편집] 관련된 정보

  1. NO_UNNEST 힌트
  2. _COMPLEX_VIEW_MERGING 파라미터
  3. _OPTIMIZER_COST_BASED_TRANSFORMATION 파라미터
  4. _PUSH_JOIN_PREDICATE 파라미터


[편집] 외부 참조

  1. http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005784
  2. http://www.psoug.org/reference/hints.html