사용자 도구

사이트 도구


study:oracle:datadb:2week_1:chap3

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

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