■ 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