사용자 도구

사이트 도구


study:oracle:datadb:2week_1:chap4

문서의 이전 판입니다!


제 3장 SQL의 실행계획 - 질의의 변환(Query Transforming)

  1. 옵티마이져는 가능한 모든 수식의 값을 미리 구한다
  2. <color red>보다 양호한 실행계획을 얻을 수 있도록 가능한 최대로 적절하게 SQL 형태를 변환하는 것이 중요하다</color>

이행성 규칙(Transitivity principle)

  1. 조건절에 같은 컬럼을 사용한 두 개의 조건식이 있다면 옵티마이져는 새로운 조건식을 이행성규칙에 따라 생성하고 이 조건식을 이용하여 최적화를 수행
  2. <color blue>원래의 조건식에서는 인덱스를 사용하지 못하게 되었더라도 인덱스를 사용하는 실행계획이 나타날 수 있다</color>
  3. 조건식 형식
    WHERE column1 comparison_operators  constant
         AND column1 = column2 
    1. comparison_operators : =, !=, ^=, <, <>, >, ⇐, >= 중 하나
    2. constant : 연산, SQL 함수, 문자열, 바인드 변수, 상관관계 변수를 포함하는 상수 수식

[예1] 이행성 규칙

  1. <color blue>비용기준 업티마이져를 사용할 때만 적용</color>
  2. SELECT *
    FROM  emp e, dept d
    WHERE e.deptno = 20
      AND e.deptno = d.deptno;
  3. 만약 e.deptno 인덱스가 없었다면, EMP테이블을 전체 테이블 액세스를 하면서 매번 dept 테이블 연결
  4. 이행성 규칙에 의해 실행계획이 DEPT 테이블을 먼저 인덱스로 액세스하는 실행계획이 가능

비교하는 대상이 상수 수식이 아닌 컬럼인 경우는 이행이 일어나지 않음

WHERE column1 comparison_operators  column3
     AND column1 = column2

[예2] 이행성 규칙 - OR조건을 가진 UNION ALL 사용

  1. OR를 가지는 조건들을 UNION ALL을 사용한 복합 문장으로 변환하는 경우이다
  2. UNION ALL로 각각의 인덱스를 경유하는 실행계획을 수립하고 이를 결합
  3. 이런 현상은 IN 을 사용한 상수수식 비교에서도 유사하게 나타난다
    그 이유는 이런한 형태의 IN은 OR로 변환되기 때문이다

변환기준

  1. OR를 사용한 조건절을 분기시켰을 때 각각이 인덱스 접근 경로로 이용할 수 있다면 변환을 수행
  2. 인덱스 사용불가로 전체 테이블을 스캔 하거나, OR 조건이 검증기능만 수행하면 변환하지 않음
  3. 즉, 분기된 각각의 액세스가 불필요한 범위를 액세스하지 않는다고 판단한 경우에만 적용

실행계획

  1. IN-LIST ITERATORCONCATENATION으로 실행계획이 나타남
  2. 강제적인 적용을 위해 ‘USE_CONCAT’ 힌트를 사용.
  3. 함부로 사용하면 액세스가 불필요하게 분기되어 오히려 처리량이 크게 증가
SQL
SELECT *
FROM emp
WHERE job = 'CLERK'
  OR  deptno = 10;
SQL 변환
SELECT * FROM emp WHERE deptno = 10
UNION ALL
SELECT * FROM emp WHERE job = 'CLERK‘ and deptno <> 10;

[예3] 이행성 규칙 - 서버쿼리의 변환

  1. 서비쿼리를 가진 복잡한 문장을 조인 문장으로 변환하는 경우
  2. 최적화하기 위해서는 2가지 방법 중 하나를 선택

뷰병합(View Merging)

사용자 정의 바인드 변수의 엿보기(Peeking)

study/oracle/datadb/2week_1/chap4.1273739921.txt.gz · 마지막으로 수정됨: 2010/05/13 17:38 저자 starlits