문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 마지막 판 양쪽 다음 판 | ||
study:oracle:datadb:2week_1:chap2 [2010/05/13 16:13] newys |
study:oracle:datadb:2week_1:chap2 [2010/05/13 20:57] starlits |
||
---|---|---|---|
줄 111: | 줄 111: | ||
* 시스템 통계(System statistics) : 해당 시스템이 가지고 있는 성능특성을 실제로 측정함으로 보다 정확한 정보를 옵티마이져에게 제공 | * 시스템 통계(System statistics) : 해당 시스템이 가지고 있는 성능특성을 실제로 측정함으로 보다 정확한 정보를 옵티마이져에게 제공 | ||
* 시스템 통계를 생성할 때는 지정한 기간동안 시스템에서 실제로 일어나고 있는 활동들을 모니터링하고 분석 | * 시스템 통계를 생성할 때는 지정한 기간동안 시스템에서 실제로 일어나고 있는 활동들을 모니터링하고 분석 | ||
- | * 관련 프로시져(DBMS_STATS.GATHER_SYSTEM.STATS)를 수행시켜 통계정보를 수집해 주어야 함 | + | * 관련 프로시져(DBMS_STATS.GATHER_SYSTEM_STATS)를 수행시켜 통계정보를 수집해 주어야 함 |
- 통계정보 교체하는 방법 | - 통계정보 교체하는 방법 | ||
* DBMS_STATS패지지의 ‘IMPORT_SYSTEM_STATS' | * DBMS_STATS패지지의 ‘IMPORT_SYSTEM_STATS' | ||
줄 131: | 줄 131: | ||
| | ||
* 완전한 비용기준 최적화 방법은 ALL_ROWS와 FIRST_ROWS_n이며, | * 완전한 비용기준 최적화 방법은 ALL_ROWS와 FIRST_ROWS_n이며, | ||
+ | |||
+ | {{: | ||
+ | |||
===나. 옵티마이져 모드의 결정 기준 === | ===나. 옵티마이져 모드의 결정 기준 === | ||
* OLTP형 시스템 중에서 ‘CHOOSE' | * OLTP형 시스템 중에서 ‘CHOOSE' | ||
줄 136: | 줄 139: | ||
* OLTP형 업무처럼 배치처리 위주의 시스템이라면 ALL_ROWS를 지정하는 것이 좋다 | * OLTP형 업무처럼 배치처리 위주의 시스템이라면 ALL_ROWS를 지정하는 것이 좋다 | ||
* 옵티마이져 모드를 운영중에 바꾸는 것은 위험 | * 옵티마이져 모드를 운영중에 바꾸는 것은 위험 | ||
+ | |||
+ | == OLTP [online transaction processing] == | ||
+ | |||
+ | - 정의 : 온라인 업무의 처리 형태의 하나이다. \\ 터미널에서 받은 메시지를 따라 호스트가 처리를 하고, 그 결과를 다시 터미널에 되돌려주는 방법. | ||
+ | - 네트워크상의 여러 이용자가 실시간으로 데이터베이스의 데이터를 갱신하거나 조회하는 등의 단위 작업을 처리하는 방식을 말한다. | ||
+ | - 주로 신용카드 조회 업무나 자동 현금 지급 등 금융 전산 관련 부문에서 많이 발생하기 때문에 ‘온라인 거래처리’라고도 한다. | ||
+ | - 이 방식의 특징은 기존 컴퓨터 통신에서 이용해 온라인 방식과 달리 다수의 이용자가 거의 동시에 이용할 수 있도록 \\ 송수신 자료를 트랜잭션(데이터 파일의 내용에 영향을 미치는 거래 ·입출고 ·저장 등의 단위 행위) 단위로 압축, \\ 비어 있는 공간을 다른 사용자들이 함께 쓸 수 있도록 한 점이다. </ | ||
+ | |||
===다.옵티마이져 모드와 관련된 파라메터 지정 === | ===다.옵티마이져 모드와 관련된 파라메터 지정 === | ||
* CURSOR_SHARING : SQL문장 내의 조건절에 있는 상수값들을 변수로 전환시켜 파싱 | * CURSOR_SHARING : SQL문장 내의 조건절에 있는 상수값들을 변수로 전환시켜 파싱 | ||
+ | * FORCE, SIMILAR, EXACT (default) | ||
+ | * EXACT는 대·소문자, | ||
+ | * SIMILAR, FORCE는 조건절에 상수값을 변수로 인정하여 실행계획을 수립\\ 실행계획의 공유비율을 높임. 그러나 ‘ALTER SESSION’ 명령을 이용한 변경이 바람직함 | ||
+ | * 아우트라인 적용 시는 EXACT를 지정해서는 안됨 | ||
* DB_FILE_MULTIBLOCK_READ_COUNT : 전체 테이블을 스캔하거나 인덱스 고속전체스캔을 할 때 한번의 I/O에 읽어야 할 블록 수를 지정 | * DB_FILE_MULTIBLOCK_READ_COUNT : 전체 테이블을 스캔하거나 인덱스 고속전체스캔을 할 때 한번의 I/O에 읽어야 할 블록 수를 지정 | ||
+ | * 운송단가와 같은 것, 옵티마이져가 비용을 계산할 때 중요하게 사용 | ||
+ | * 기본값은 8로 지정. 대용량의 배치처리를 위주라면 좀더 증가 | ||
* OPTIMIZER_INDEX_CACHING : Nested Loops 조인이나 IN_List 탐침으로 수행되어 인덱스를 통해 반복해서 랜덤 액세스를 할 때 인덱스 블록들이 버퍼에 캐쉬되어 있을 확률을 나타냄 | * OPTIMIZER_INDEX_CACHING : Nested Loops 조인이나 IN_List 탐침으로 수행되어 인덱스를 통해 반복해서 랜덤 액세스를 할 때 인덱스 블록들이 버퍼에 캐쉬되어 있을 확률을 나타냄 | ||
- | | + | * 기본값은 0으로 지정 |
+ | * 메모리에 부담을 줄 수 있으므로 특정 세션에만 지정하는 것이 바람직함 | ||
+ | * 인덱스가 적은 블록을 가지거나 특정 범위를 액세스하여 재사용률이 높다면 이 값을 증가 | ||
+ | | ||
+ | * 100(기본값)은 계산된 비용을 그대로 적용한다는 의미, 10을 주었다면 1/10로 계산하겠다는 의미 | ||
+ | * 인덱스를 액세스가 전체테이블 스캔으로 | ||
+ | * 기본값으로 지정해 두고, 특정한 세션에 대해서만 선별적으로 적용 | ||
+ | | ||
* 옵티마이져가 규칙기준에서 비용기준으로 넘어가면서 ‘CHOOSE' | * 옵티마이져가 규칙기준에서 비용기준으로 넘어가면서 ‘CHOOSE' | ||
* 동적표본화 (Dynamic Sampling) : 소량의 표본을 동적으로 추출하여 통계정보로 활용 | * 동적표본화 (Dynamic Sampling) : 소량의 표본을 동적으로 추출하여 통계정보로 활용 | ||
줄 147: | 줄 171: | ||
==== 3.1.2.4 실행계획의 고정화==== | ==== 3.1.2.4 실행계획의 고정화==== | ||
- 최적의 실행계획을 적용할려고 해도 옵티마이져가 고집을 부릴 때 제어필요=> | - 최적의 실행계획을 적용할려고 해도 옵티마이져가 고집을 부릴 때 제어필요=> | ||
- | - 아우트라인 ? 과거에 수립되었던 실행계획의 요약본을 저장하고 있다가 이것을 참조하여 실행계획을 수립하는 기능아우트라인은 범용적으로 관리하거나 개별적으로 관리할 수 있고 적용 금지 가능 | + | - 아우트라인 ? 과거에 수립되었던 실행계획의 요약본을 저장하고 있다가 이것을 참조하여 실행계획을 수립하는 기능\\ |
+ | - 아우트라인은 범용적으로 관리하거나 개별적으로 관리할 수 있고 적용 금지 가능 | ||
* 선별적인 적용을 가능하게 하기 위해 카테고리(Category) 지정하여 별도 관리 | * 선별적인 적용을 가능하게 하기 위해 카테고리(Category) 지정하여 별도 관리 | ||
+ | |||
=== 가. 아우트라인의 생성과 조정 === | === 가. 아우트라인의 생성과 조정 === | ||
- DBMS_OUTLN과 DBMS_OUTLN_EDIT 패키지 이용 | - DBMS_OUTLN과 DBMS_OUTLN_EDIT 패키지 이용 | ||
줄 159: | 줄 185: | ||
- CREATE_STORED_OUTLINES를 지정하여 생성하고 종료 | - CREATE_STORED_OUTLINES를 지정하여 생성하고 종료 | ||
- TRUE/ | - TRUE/ | ||
- | * TRUE로 지정하면 ‘DEFAULT' | + | * TRUE로 지정하면 ‘DEFAULT' |
- | * 조정필요시 작업과정 | + | |
- | | + | * 조정필요시 작업과정 |
- | ② 아우트라인을 수정할 수 있는 툴이나 DBMS_OUTLN_EDIT패키지에 있는 여러 프로시져를 갱신 | + | |
- | | + | |
- | ③ 생성된 개별 아우트라인을 검증하기 위해 USE_PRIVATE_OUTLINES을 TRUE로 지정하고 검증 | + | |
- | ④ 충분한 검증을 끝내고 공식적인 적용 | + | |
- | | + | |
- | ⑤ 적용이 되었으면 USE_PRIVATE_OUTLINES을 FALSE로 지정하여 자신의 개별 아우트라인 수행 종료</ | + | |
| | ||
===나. 아우트라인의 관찰 === | ===나. 아우트라인의 관찰 === | ||
+ | - 생성된 아우트라인은 딕셔너리 테이블에 저장 | ||
+ | - 뷰를 통해 내용 확인 가능 | ||
+ | * EX> USER_OUTLNES OR USER_OUTLINE_HINTS | ||
+ | < | ||
+ | EX> select empno, ename, job, loc | ||
+ | from emp e, dept d | ||
+ | where e.deptno = d.deptno and e.empno = 7856 | ||
+ | order by loc | ||
+ | </ | ||
+ | {{: | ||
+ | |||
+ | * 실제테이블인 OUTLN.OL$HINTS에서 확인 | ||
+ | {{: | ||
===다. 옵티마이져 업그레이드 시의 적용=== | ===다. 옵티마이져 업그레이드 시의 적용=== | ||
- | - 규칙기반에서 전환하는 경우 | + | - 규칙기반에서 전환하는 경우 |
- | ① 현재의 규칙기준으로 수행되는 SQL에 대하여 특정 카테고리를 주고 아우트 라인 생성 | + | |
- | ALTER SESSION SET CREATE_STORED_OUTLINES =category_name; | + | |
- | | + | |
- | ② 수집기간을 적절하게 한다. | + | |
- | ③ 아우트라인 생성을 종료시키려면 CREATE_STORED_OUTLINES파라메터를 ' | + | |
- | ④ DBMS_STATS 패키지를 이용하여 통계정보 생성 | + | |
- | ⑤ 옵티마이져 모드를 RULE에서 CHOOSE로 변경 | + | |
- | ⑥ ALTER SESSION 명령어를 이용하여 USE_STORED_OUTLINES 파라메터에 앞서 생성해 두었던 카페고리를 지정하여 아우트라인 적용( ALTER SYSTEM) | + | |
- | </ | + | |
-옵티마이저 버전 업그레이드 | -옵티마이저 버전 업그레이드 | ||
* 위 ①~③번 수행후 애플리케이션을 수행하면서 테스트 실시 | * 위 ①~③번 수행후 애플리케이션을 수행하면서 테스트 실시 | ||
* 업그레이드 후 문제가 발생되면 아우트라인을 적용하여 과거 버전의 수행계획을 고수 -> | * 업그레이드 후 문제가 발생되면 아우트라인을 적용하여 과거 버전의 수행계획을 고수 -> | ||
- | - 아우트라인 적용방법< | + | - 아우트라인 적용방법 |
- | ① 원하는 대상 SQL에 대해 원하는 실행계획을 아우트라인으로 생성 | + | |
- | ALTER OUTLINES outline_name CHANGE CATEGORY TO out_category_name; | + | ALTER OUTLINES outline_name CHANGE CATEGORY TO out_category_name; |
+ | </ | ||
+ | - ALTER SESSION SET USE_STORED_OUTLINES=our_category_name을 통해 아우트라인 적용 | ||
- | ② ALTER SESSION SET USE_STORED_OUTLINES=our_category_name을 통해 아우트라인 적용</ | ||
+ | ====3.1.2.5.옵티마이져의 한계 ==== | ||
- | === 옵티마이져의 한계 === | + | - 현재의 정보로 미래를 예측 |
+ | - 정확한 분포도 산정이 어려움 | ||
+ | * 컬럼의 사용 연산자별로 정확한 분포도 | ||
+ | * 컬럼의 결합에 따는 정확한 분포도 | ||
+ | * 인덱스 컬럼의 결합 순서 및 사용 유무에 따른 분포도 | ||
+ | - 현실에서 사용되는 대부분의 조건은 변수 형태 | ||
+ | * 변수상태로 파싱할 때는 평균값에 의존 | ||
+ | | ||