본문 바로가기

프로그래밍/oracle

oracle - [Hint]ACCESS 경로를 변경하는 힌트(NO_EXPAND)

반응형

[Hint]ACCESS 경로를 변경하는 힌트(NO_EXPAND)
 
 
[Hint]ACCESS 경로를 변경하는 힌트(NO_EXPAND)

NO_EXPAND 힌트는 COST BASED Optimizer 모드에서 OR 조건이나 IN List등을 사용할 때 OR확장(Concatenation등을 사용하여..)을 막는 것인데 실행 계획에 Concatenation이 나타날 수 있는데 이를 사용하지 않도록 않도록 처리해 줍니다.

즉 OR를 UNION-ALL로 풀지 말고

아래의 예를 보죠~

[형식]
/*+ NO_EXPAND */

실습을 위해 먼저 옵티마이저 모드를 RULE로 바꾼 후 …

왜 바꾸냐 하면?  EMP 테이블의 경우 데이터 양이 적으므로 OR를 사용하더라도 FULL SCAN하는 실행계획을 만들어 내므로 고의로 CONCATENATION을 만들어 내기 위해 RULE BASED Optimizer Mode로 변경하는 것입니다. 물론 옵티마이저 모드를 CHOOSE로 한 후 테이블의 통계 정보를 삭제하는 경우에도 동일 합니다.

alter session set optimizer_mode=rule;

SELECT ename, sal
FROM   EMP
WHERE  JOB   = 'CLERK'
OR     JOB   = 'SALESMAN'

-----------------------------------------------------------------
Operation        Object Name        Rows        Bytes        Cost       
-----------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=RULE                                            
  CONCATENATION                                                                   
    TABLE ACCESS BY INDEX ROWID        SCOTT.EMP                                    
      INDEX RANGE SCAN        SCOTT.IDX_EMP_JOB                                    
    TABLE ACCESS BY INDEX ROWID        SCOTT.EMP                                    
      INDEX RANGE SCAN        SCOTT.IDX_EMP_JOB                                    

 

SELECT /*+ NO_EXPAND */
       ENAME, SAL
FROM   EMP
WHERE  JOB   = 'CLERK'
OR     JOB   = 'SALESMAN'

Operation        Object Name        Rows        Bytes        Cost       
SELECT STATEMENT Optimizer Mode=RULE                6                   2          
  INLIST ITERATOR                                                                   
    TABLE ACCESS BY INDEX ROWID        SCOTT.EMP        6          96          2          
      INDEX RANGE SCAN        SCOTT.IDX_EMP_JOB        6                   1          


 
 
 
 

반응형