■ ALL_ROWS
  - throughput 최대화를 위한 optimizing을 한다.
  - full table scan을 선호하는 경향이 있다.
  - batch 프로그램 또는 report 출력 프로그램에 사용되는게 좋다.


■ FIRST_ROWS 
  - response time 최소화를 위한 optimizing을 한다.
  - index scan을 선호하는 경향이 있다.
  - index scan을 선호하는 경향이 있기에 작은 테이블로부터 데이터를 찾을 때도 index scan을 해서 full table scan을 하는 것보다 cost가 더 걸리는 단점이 있다.
  - user interaction 즉, 화면계에 사용하면 좋다.
 

■ FIRST_ROWS_N
  - Oracle 9i부터 도입된 파라미터.
  - FIRST_ROWS의 단점을 보안했다.
    단점이란, FIRST_ROWS_1, FIRST_ROWS_10, FIRST_ROWS_100, FIRST_ROWS_1000 처럼
    FIRST ROWS의 범위를 지정하도록 함으로써 index scan를 해야하는 지, full table scan을 해야하는 지에대한 선택을 더 현명하게 하도록 했다는 것이다.

 


● Optimizer Mode
───────────────────────────────────────────────────────────────────────────
1.CHOOSE : 통계 정보가 있는 경우 CBO로 운영하고, 통계 정보가 없을 경우 RBO로 동작하라는 의미 (9i default value)

2.ALL_ROWS : "테이블 안에 있는 전체 데이터를 검색해서 전체의 합이나 평균을 구하겠다"할 경우에 사용.
        주로 OLAP(Online Analytical Processing)에 적당 (10g default value)

3.Rule : SQL문에 대한 실행계획이 여러 개 있다고 할 때, 가장 낮은 순위의 실행계획을 항상 사용하는 RBO 환경에서 사용

4.FIRST_ROWS(FIRST_ROWS_N) : 일부 데이터를 보여주는데 최적화된 모드.
      SQL문의 WHERE 조건을 만족하는 첫 번째 행(혹은 1,10,100,1000 행)을 가장 빠르게 검색하는 실행계획을 결정.
      주로 OLTP(Online Transaction Processing)에 적당 

● FIRST_ROWS_1 : 1개 행을
● FIRST_ROWS_10 : ~~ 10개 행을
● FIRST_ROWS_100 : ~~ 100개 행을
● FIRST_ROWS_1000 : ~~ 1000개 행을 

 

● MODE         장점                                            단점
───────────────────────────────────────────────────────────────────────────
RULE            Analyze작업이 불필요, 일정한 응답속도를 기대    전문가에게 의존도가 매우 높음, optimizer 대부분의 기능을 사용 못함 
CHOOSE          optimizer 기능을 최대한 활용                    주기적인 Analyze작업이 필요, 비효율적인 실행계획수립 발생 
FIRST_ROWS      Nested Loop 위주의 실행계획수립                 일부 Hash Join으로 바꾸는 작업 필요 
ALL_ROWS        Hash Join 위주의 실행계획 수립                  일부를 Nested Loop로 바꾸는 작업 필요 

 

● Optimizer Mode 설정 방법 
───────────────────────────────────────────────────────────────────────────
1.시스템 전체 지정(instance level) : initSID.ora에서 설정. 변경시에는 DB를 재시작. 
OPTIMIZER MODE = { RULL / CHOOSE / FIRST_ROWS / ALL_ROWS }

혹은

ALTER SYSTEM SET OPTIMIZE_MODE = ( CHOOSE, ALL_ROWS, FIRST_ROWS, RULE ) SCOPE = BOTH;

2.세션 지정 (Seesion level) 
ALTER SESSION SET OPTIMIZE_MODE = ( CHOOSE, ALL_ROWS, FIRST_ROWS, RULE );

3.SQL문장 지정 (Statement level) 
SELECT /*+ (ALL_ROWS, FIRST_ROWS, RULE, FIRST_ROWS[(n)]) * / ~~~ FROM ~~~

4.우선순위 : Statement > Session > Instance

5.현재 설정된 optimizer mode 확인 
SELECT NAME, VALUE, ISDEFAULT, ISMODIFIED, DESCRIPTION
FROM V$PARAMETER
WHERE NAME LIKE '%optimizer_mode%';


● 참조
───────────────────────────────────────────────────────────────────────────
http://docs.oracle.com/cd/B19306_01/server.102/b14211/optimops.htm