티스토리 뷰

옵티마이저(Optimizer)

SQL에 대해 해석(parse)을 하고 데이터를 처리하기 위해 작업

방법을 수립하는 process이다.

* Optimizer 종류 (Rule Base Optimizer - RBO

Cost Base Optimizer - CBO)

★★★★★

RBO와 CBO 간에 차이점이 많이 있음!

㈜ Sybase, IBM DB2, MS SQL*Server, My SQL, INFORMIX, TIBERA

~ 이러한 제품들은 Cost base 옵티마이저만 지원함.

1) RBO (Rule Base Optimizer)

Optimizer의 판단은 정해진 규칙(rule)에 근간을 둠

- 가능한 한 주어진 조건에 의해 인덱스를 사용할수만 있다면

무조건 인덱스를 사용하려는 특성이 있다.

○ 각 규칙(Rule) 간에 우선순위가 존재함 - [표 1-2-1]

- Rank 1 vs. Rank 4

SELECT * FROM dept

WHERE rowid='AAAGUJAAJAAABuKAAD'

AND deptno = 40;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY USER ROWID) OF 'DEPT'

SELECT * FROM dept

WHERE rowid LIKE 'AAAGUJAAJAA%'

AND deptno = 40;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

2 1 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

SELECT * FROM dept

WHERE rowid LIKE 'AAAGUJAAJAA%'

AND deptno BETWEEN 10 and 30;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

2 1 INDEX (RANGE SCAN) OF 'PK_DEPT' (UNIQUE)

- Rank 8 vs. Rank 9

ex) create index job_deptno_index on emp(job, deptno);

create index job_index on emp(job);

SELECT * FROM emp

WHERE job = 'CLERK' AND deptno = 30;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'JOB_DEPTNO_INDEX' (NON-UNIQUE)

SELECT * FROM emp

WHERE job = 'CLERK' AND deptno >= 30;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'JOB_INDEX' (NON-UNIQUE)

SELECT * FROM emp

WHERE job = 'CLERK' AND deptno between 10 and 30;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'JOB_INDEX' (NON-UNIQUE)

SELECT * FROM emp

WHERE job LIKE 'CL%' AND deptno >= 30;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'JOB_DEPTNO_INDEX' (NON-UNIQUE)

→ column 개수가 많은 것을 선택

- Rank 10 vs. Rank 11

ex) create index dept_index on emp (deptno);

create index job_index on emp (job);

SELECT * FROM emp

WHERE job LIKE 'C%'

AND deptno >= 30;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'JOB_INDEX' (NON-UNIQUE)

SELECT * FROM emp

WHERE job LIKE 'C%'

AND deptno BETWEEN 10 AND 40;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'JOB_INDEX' (NON-UNIQUE)

→ 나중에 생성된 인덱스를 선택

SELECT * FROM emp

WHERE job = 'CLERK'

AND deptno = 30;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=RULE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 AND-EQUAL

3 2 INDEX (RANGE SCAN) OF 'JOB_INDEX' (NON-UNIQUE)

4 2 INDEX (RANGE SCAN) OF 'DEPT_INDEX' (NON-UNIQUE)

→ 모두 사용함

2) CBO (Cost Base Optimizer)

Optimizer의 판단에 의해 산정한 비용이 최소인 것을 채택함.

비용 산정시 이용되는 정보 중 Objects에 대한 ANALYZE 정보가

매우 큰 비중을 차지함.

정기적으로 통계정보를 생성하는 것이 매우 중요함

-- 참고

* MySQL의 경우는 오라클의 명령과 동일함.

* MS SQL*Server

UPDATE STATISTICS EC_PROGRESS;

* IBM DB2 :

RUNSTATS ON TABLE EC_PROGRESS

WITH DISTRIBUTION AND DETAILED INDEXES ALL;

* Sybase :

UPDATE STATISTICS EC_PROGRESS:

UPDATE STATISTICSEC_PROGRESS(COURSE_CODE);

UPDATE STATISTICSEC_PROGRESS(COURSE_CODE) WITH SAMPLE 5 PERCENT;

------------------------------------------------------

ANALYZE TABLE table명 COMPUTE[/ESTIMATE/DELETE] STATISTICS;

ANALYZE INDEX index명 COMPUTE[/ESTIMATE/DELETE] STATISTICS;

ANALYZE CLUSTER cluster명 COMPUTE[/ESTIMATE/DELETE] STATISTICS;

* COMPUTE STATISTICS 옵션

- 테이블이 갖고 있는 전체 데이터를 대상으로 통계정보를

생성하는 옵션임. 작업시 많은 시간이 소요되며, 또한

데이터베이스에 부하를 많이 줄 수 있음

SQL> ANALYZE TABLE EC_APPLY COMPUTE STATISTICS;

* ESTIMATE STATISTICS 옵션 사용시 :

(예) ANALYZE TABLE APPLY ESTIMATE STATISTICS

SAMPLE 10000 ROWS;

ANALYZE TABLE APPLY ESTIMATE STATISTICS

SAMPLE 5 PERCENT;

* ESTIMATE STATISTICS 옵션은 주로 데이터 건수가 많은 테이블에

대해 통계정보 생성시 사용한다.

* DBMS_STATS Package

- DBMS_STATS.GATHER_TABLE_STATS('hr','EMP',NULL,20,FALSE,'FOR ALL COLUMNS',4)

- DBMS_STATS.GATHER_TABLE_STATS('hr','EMP',NULL,NULL,FALSE,'FOR ALL COLUMNS',4)

- DBMS_STATS.GATHER_SCHEMA_STATS('hr');

- DBMS_STATS.GATHER_DATABASE_STATS;

OPTIMIZER 지정

==============

* OPTIMIZER_MODE parameter를 사용해서 지정할 수 있음.

- CHOOSE : ANALYZE에 의한 통계정보의 유무(有無)에 따라

통계정보가 있으면 CBO(Cost Base Optimizer)

통계정보가 없으면 RBO(Rule Base Optimizer)

- RULE : RBO(Rule Base Optimizer)

* ANALYZE에 의한 통계정보 생성이 무의미

- FIRST_ROWS/ALL_ROWS : CBO(Cost Base Optimizer)

* FIRST_ROWS - 주로 OLTP성 시스템에 적용

~ 세분화해서 값을 사용할 수 있게 됨.

FIRST_ROWS_1, FIRST_ROWS_10,

FIRST_ROWS_100, FIRST_ROWS_1000

* ALL_ROWS - 주로 Batch성 시스템에 적용

* 레벨별 설정에서의 우선 순위

데이터베이스 레벨 < 세션 레벨 < 명령문 레벨

- 세션 레벨로 옵티마이저를 변경하려면,

SQL> ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS;

- 명령문 레벨로 옵티마이저를 변경하려면,

SQL> SELECT /*+ ALL_ROWS */

ENAME, JOB, SAL

FROM EMP

WHERE EMPNO > 0;

★★★★★

옵티마이저 모드에 따른 SQL분석의 차이

SELECT A.ENAME, B.DNAME

FROM EMP A, DEPT B

WHERE A.DEPTNO = B.DEPTNO

AND A.DEPTNO = 10;

Execution Plan

---------------------------------------------------------- 0

0 SELECT STATEMENT Optimizer=RULE |

1 0 NESTED LOOPS 1

2 1 TABLE ACCESS (FULL) OF 'EMP' (A) / \

3 2 INDEX (RANGE SCAN) OF 'DEPT_INDEX' (NON-UNIQUE) 2 4

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' (B) | |

5 4 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) 3 5

Execution Plan

---------------------------------------------------------- 0

0 SELECT STATEMENT Optimizer=FIRST_ROWS |

1 0 NESTED LOOPS 1

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' (B) / \

3 2 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) 2 4

4 1 TABLE ACCESS (FULL) OF 'EMP' (A) | |

5 4 INDEX (RANGE SCAN) OF 'DEPT_INDEX' (NON-UNIQUE) 3 5

Cost base인 경우, 위의 sql문을 다음과 같이 변경해서 실행하게 된다.

SELECT A.ENAME, B.DNAME

FROM EMP A, DEPT B

WHERE A.DEPTNO = B.DEPTNO

AND A.DEPTNO = 10

AND B.DEPTNO = 10; <------- 자동 인식!!!

'It' 카테고리의 다른 글

자바 리스트 List - 1  (0) 2023.03.20
스프링 개발환경구축 (7) Jenkins 설치  (0) 2023.03.19
토러스 네트워크(torus network)  (0) 2023.03.17
파이썬 while 반복문 while 반복  (0) 2023.03.16
파일의 구조  (0) 2023.03.15
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함