문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
study:oracle:datadb:2week_1:chap3 [2010/05/13 14:33] starlits |
study:oracle:datadb:2week_1:chap3 [2010/05/13 15:13] (현재) starlits |
||
---|---|---|---|
줄 1: | 줄 1: | ||
- | ====== 제 3장 SQL의 실행계획 | + | ====== 제 3장 SQL의 실행계획 |
- | + | ||
- | + | ||
- | ===== 옵티마이져의 최적화 절차 | + | |
{{: | {{: | ||
줄 11: | 줄 8: | ||
- Optimizer는 비용이 산출된 실행계획들을 비교하여 가장 최소의 비용을 가진 실행계획을 선택한다 | - Optimizer는 비용이 산출된 실행계획들을 비교하여 가장 최소의 비용을 가진 실행계획을 선택한다 | ||
- | ==== 개요 | + | ===== 개요 |
- | === === | + | ==== ==== |
^ 최적화 절차 ^ 비용 산정기 ^ 실행계획 생성기 ^ | ^ 최적화 절차 ^ 비용 산정기 ^ 실행계획 생성기 ^ | ||
| View Merging | | View Merging | ||
줄 22: | 줄 19: | ||
| Peeking | | | Peeking | | ||
- | ==== 질의 변환기 ==== | + | ===== 질의 변환기 |
- | === 정의 === | + | ==== 정의 |
* 보다 양호한 실행계획을 얻을 수 있도록 | * 보다 양호한 실행계획을 얻을 수 있도록 | ||
- | == 뷰병합(View Merging) == | + | === 뷰병합(View Merging) |
- 뷰 정의 시에 지정한 쿼리(뷰쿼리)를 액세스가 수행되는 쿼리(액세스쿼리)에 병합(Merge) | - 뷰 정의 시에 지정한 쿼리(뷰쿼리)를 액세스가 수행되는 쿼리(액세스쿼리)에 병합(Merge) | ||
- <color blue> | - <color blue> | ||
줄 33: | 줄 30: | ||
- 몇 가지 제한요소가 있어 이를 준수하지 않으면 뷰병합은 불가능 | - 몇 가지 제한요소가 있어 이를 준수하지 않으면 뷰병합은 불가능 | ||
- | == 조건절 진입(Predicate Pushing) == | + | === 조건절 진입(Predicate Pushing) |
- <color blue> | - <color blue> | ||
- 액세스쿼리를 뷰쿼리로 진입시키는 방법 | - 액세스쿼리를 뷰쿼리로 진입시키는 방법 | ||
- 이렇게 가능한 모든 방법을 동원해서 부여 조건을 뷰쿼리 내에 최대한 반영시켜 보다 양호한 실행계획을 유도 | - 이렇게 가능한 모든 방법을 동원해서 부여 조건을 뷰쿼리 내에 최대한 반영시켜 보다 양호한 실행계획을 유도 | ||
- | == 서브쿼리 비내포화(Subquery Unnesting) == | + | === 서브쿼리 비내포화(Subquery Unnesting) |
- <color blue> | - <color blue> | ||
- 실제로 대부분의 서브쿼리는 이러한 변환을 거침 | - 실제로 대부분의 서브쿼리는 이러한 변환을 거침 | ||
줄 44: | 줄 41: | ||
- 서브쿼리가 수행되는 순서에 따라 수행속도에는 매우 큰 차이가 나타날 수 있음 | - 서브쿼리가 수행되는 순서에 따라 수행속도에는 매우 큰 차이가 나타날 수 있음 | ||
- | == Meterialized View(실체뷰)의 쿼리 재생성(Query rewrite) == | + | === Meterialized View(실체뷰)의 쿼리 재생성(Query rewrite) |
- <color blue> | - <color blue> | ||
- 일종의 확장된 뷰병합 기능 | - 일종의 확장된 뷰병합 기능 | ||
줄 50: | 줄 47: | ||
- M-View의 쿼리 재생성(Query Rewrite)은 비용기준에 의해 결정 \\ (테이블 액세스가 적은 비용을 가지면 쿼리 재생성 하지 않음) | - M-View의 쿼리 재생성(Query Rewrite)은 비용기준에 의해 결정 \\ (테이블 액세스가 적은 비용을 가지면 쿼리 재생성 하지 않음) | ||
- | == OR 조건의 전개(expansion) == | + | === OR 조건의 전개(expansion) |
- <color blue> | - <color blue> | ||
- 단지 체크 조건으로만 사용되는 경우에 이와 같은 전개가 발생하면 오히려 큰 비효율이 발생 | - 단지 체크 조건으로만 사용되는 경우에 이와 같은 전개가 발생하면 오히려 큰 비효율이 발생 | ||
- 옵티마이져는 비용기준에 의해 전개여부를 결정 | - 옵티마이져는 비용기준에 의해 전개여부를 결정 | ||
- | == 사용자 정의바인드 변수 엿보기(Peeking) == | + | === 사용자 정의바인드 변수 엿보기(Peeking) |
- Optimizer는 쿼리 내에 사용자가 조건절에 지정한 바인드 변수가 있을 때 실제로 그 변수에 어떤 값이 들어올지 알 수 없기 때문에 통계정보를 제대로 참조할 수 없음 | - Optimizer는 쿼리 내에 사용자가 조건절에 지정한 바인드 변수가 있을 때 실제로 그 변수에 어떤 값이 들어올지 알 수 없기 때문에 통계정보를 제대로 참조할 수 없음 | ||
줄 63: | 줄 60: | ||
- 실제 적용상의 입장에서 보면 상당히 중요한 의미를 가짐 | - 실제 적용상의 입장에서 보면 상당히 중요한 의미를 가짐 | ||
- | ==== 비용 산정기 ==== | + | ===== 비용 산정기 |
- 옵티마이져의 비용산정은 크게 선택도(selectivity), | - 옵티마이져의 비용산정은 크게 선택도(selectivity), | ||
- | === 선택도(Selectivity) === | + | ==== 선택도(Selectivity) ==== |
+ | - <color blue> | ||
+ | - 선택도는 <color red> | ||
+ | - 0.0 : 대상 집합에서 전혀 존재하는 않음 | ||
+ | - 1.0 : 모든 대상 집합이 모두 해당 | ||
+ | - 컬럼에 있는 값의 종류가 10가지라면 선택도는 0.1(=1/10) 이다. | ||
- | === 카디널러티(Cardinality) | + | === === |
+ | **선택도의 값이 낮게 측정되었다** -> <color blue> | ||
- | === 비용(Cost) === | + | ==== 카디널러티(Cardinality) ==== |
+ | - 실행계획에서 <color blue> | ||
+ | - 판정 대상이 가진 결과 건수 혹은 다음 단계로 들어가는 중간결과건수 의미 | ||
+ | - <color blue> | ||
+ | - 선택도가 있음에도 불구하고 카디널러티가 필요한 이유는 **선택도는 단지 비율에 지나지 않기 때문이다** | ||
+ | - 선택도는 단지 비율일 뿐임. 백만 건의 1%와 백 건의 1%는 비율은 같지만 절대량은 같지 않다. | ||
- | ==== 실행계획 생성기 ==== | + | ==== 비용(Cost) ==== |
+ | - 실행계획에서 <color blue> | ||
+ | - 실행계획 상의 각 연산들을 수행할 때 소요되는 시간비용을 상대적으로 계산한 예측치 | ||
+ | - 통계정보에 CPU와 메모리 상황, 디스크 I/ | ||
+ | |||
+ | === 동일한 평가결과에서 우선순위 결정 === | ||
+ | ^ 규칙기준 | 로우 캐시(Row Cache)에 나타나는 순서대로 선택 | | ||
+ | ^ 비용기준 | 인덱스명의 ASCII 값에 근거해서 결정 | | ||
+ | |||
+ | === 신뢰성의 한계 === | ||
+ | - 비용산정 과정에서 수많은 가정들을 세우고 다양한 계산식을 적용 \\ 그러나 가정들이 완벽할 수 없는 불완전한 가정이므로 때로는 잘못된 비용을 산정하게 되는 한계가 발생 | ||
+ | - 이런 문제의 보완을 위해서 다양한 힌트들과 다양한 초기화 파라메터들이 계속 추가 | ||
+ | |||
+ | |||
+ | |||
+ | ===== 실행계획 생성기 | ||
- 주어진 쿼리를 처리할 수 있는 적용 가능한 실행계획을 선별하고 비교검토를 거쳐 **가장 최소의 비용을 가진 것을 선택** | - 주어진 쿼리를 처리할 수 있는 적용 가능한 실행계획을 선별하고 비교검토를 거쳐 **가장 최소의 비용을 가진 것을 선택** | ||
줄 84: | 줄 107: | ||
- <color blue> | - <color blue> | ||
- | === 최적경로 탐색 기법 === | + | ==== 최적경로 탐색 기법 ==== |
+ | |||
+ | ^ 적응적 탐색 | ||
+ | ^ 경험적 기법 | ||
+ | ^ 힌트 | ||
+ | |||
- | ^ 적응적 탐색 | | ||
- | ^ 경험적 기법 | | ||