728x90
반응형
[SQL튜닝] 옵티마이저
주요내용
- 옵티마이저의 개념
- 옵티마이저의 종류
- 옵티마이저의 레벨별 설정
- RBO와 CBO의 실행계획 비교
학습목표
- 옵티마이저 종류에 따라 달라지는 데이터베이스 성능을 모니터링할 수 있다.
- CBO, RBO의 실행계획 확인을 통해 SQL 문장에 적합한 옵티마이저를 선택할 수 있다.
옵티마이저의 개념
- 옵티마이저 : 사용자가 실행한 SQL을 해석하고, 데이터 추출을 위한 실행계획을 수립하는 프로세스
옵티마이저의 종류
RBO(Rule Based Optimizer) : 초창기 버전부터 제공함
- 기본적으로 15개의 순위가 매겨진 규칙이 있음 -> 이를 기초로 해서 실행계획을 수립함
- SQL에 대한 실행계획이 하나 이상일 경우, 순위가 높은 규칙을 이용하게 됨
- 수립될 실행계획이 예측 가능하기 때문에 개발자가 원하는 처리 경로로 유도하기 쉬움
- 1순위 : Rowid에 의한 1 row
- 2순위 : 클러스터 조인에 의한 1 row
- 3순위 : Unique나 PK를 사용한 해시 클러스터 키에 의한 1 row
- 4순위 : Unique나 PK에 의한 1 row
- 5순위 : 클러스터 조인
- 6순위 : 해시 클러스터 키
- 7순위 : 클러스터 키
- 8순위 : 결합 칼럼(Composite) 인덱스
- 9순위 : 단일 칼럼(Single) 인덱스
- 10순위 : 인덱스에 의한 유한 영역 검색(Bounded range search on indexed columns)
- 11순위 : 인덱스에 의한 무한 영역 검색(Unbounded range search on indexed columns)
- 12순위 : 소트 머지(Sort Merge) 조인
- 13순위 : 인덱스로 구성된 칼럼의 최대 또는 최소(MAX or MIN of indexed columns)
- 14순위 : 인덱스로 구성된 칼럼으로 ORDER BY(ORDER BY on indexed columns)
- 15순위 : 인덱스 없이 전체 테이블 스캔(FTS:Full Table Scan)
CBO(Cost Based Optimizer) : v10g부터 기본적인 설정으로 적용되고 있음
- 대상 row들을 처리하는데 필요한 자원 사용을 최소화해서, 궁극적으로 데이터를 빨리 처리하는 데 목적이 있음
- CBO에 영향을 미치는 비용 산정 요소 : 각종 통계정보, Hint, 연산자, Index, Cluster, DBMS버전, CPU/Memory용량, Disk I/O 등과 같이 매우 다양함
- CBO의 통계정보
- 통계정보 : CBO의 성능을 최적의 상태로 유지시키기 위해서 테이블, 인덱스, 클러스터 등을 대상으로 통계 정보를 생성함 -> 정기적으로 analyze 작업을 하는 것이 가장 중요함
- 가장 효율적인 실행계획을 수립하기 위해 최소비용을 계산할 때 중요하게 사용됨
- ANALYZE 실행
ANALYZE TABLE emp COMPUTE STATISTICS; ANALYZE TABLE emp ESTIMATE STATISTICS SAMPLE 10 PERCENT; ANALYZE TABLE emp ESTIMATE STATISTICS SAMPLE 5 ROWS;
- ANALYZE 실행 여부 확인
SELECT table_name, num_rows, last_analyzed FROM user_tables WHERE table_name IN ('EMP', 'DEPT');
- 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
옵티마이저의 레벨별 설정
- Instance Level : initSID.ora를 이용해서 지정함
OPTIMIZER_MODE = [RULE/CHOOSE/FIRST_ROWS/ALL_ROWS]
- Session Level
SQL> ALTER SESSION SET OPTIMIZER_MODE = [RULE/CHOOSE/FIRST_ROWS/ALL_ROWS]
- Statement Level
SQL> SELECT ename FROM emp;
RBO와 CBO의 실행계획 비교
- 동일 SQL에 대해서 각 옵티마이저가 수립한 실행계획은 서로 다를 수 있음
- 이는 SQL의 퍼포먼스가 옵티마이저에 따라 다르다는 의미임
- 옵티마이저의 종류에 따라 달라지는 DB성능의 차이점을 이해하는 것이 중요함
SELECT e.ename, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno AND e.deptno = 10;
예제
-- 인덱스
EC_TASK_PK : COURSE_CODE+TASK_NO
EC_TASK_TERM_IDX00 : COURSE_CODE+TASK_NO+YEAR+COURSE_SQ_NO
SELECT A.COURSE_CODE, A.TASK_NO, A.BBS_YN, A.UPDATE_DATE, B.YEAR, B.S_DATE, B.E_DATE
FROM EC_TASK A, EC_TASK_TERM B
WHERE A.COURSE_CODE = B.COURSE_CODE
AND A.TASK_NO = B.TASK_NO
AND B.COURSE_CODE = 36
AND B.TASK_NO = 1
AND B.COURSE_SQ_NO = 1;
수정문 : RBO, CBO의 실행계획이 같도록 변경
SELECT A.COURSE_CODE, A.TASK_NO, A.BBS_YN, A.UPDATE_DATE, B.YEAR, B.S_DATE, B.E_DATE
FROM EC_TASK A, EC_TASK_TERM B
WHERE A.COURSE_CODE = B.COURSE_CODE
AND A.TASK_NO = B.TASK_NO
AND A.COURSE_CODE = 36
AND A.TASK_NO = 1
AND B.COURSE_SQ_NO = 1;
728x90
반응형
'IT 공부 > SQL' 카테고리의 다른 글
[SQL튜닝] 결합인덱스 (0) | 2024.03.12 |
---|---|
[SQL튜닝] 인덱스 (3) | 2024.03.11 |
[SQL튜닝] 실행계획 (0) | 2024.03.06 |
[SQLP] Redo (0) | 2024.01.15 |
[SQLP] 버퍼 LOCK (0) | 2024.01.15 |
댓글