study:oracle:datadb:2week_1:chap4
문서의 이전 판입니다!
목차
제 3장 SQL의 실행계획 - 질의의 변환(Query Transforming)
- 옵티마이져는 가능한 모든 수식의 값을 미리 구한다
- <color red>보다 양호한 실행계획을 얻을 수 있도록 가능한 최대로 적절하게 SQL 형태를 변환하는 것이 중요하다</color>
이행성 규칙(Transitivity principle)
- 조건절에 같은 컬럼을 사용한 두 개의 조건식이 있다면 옵티마이져는 새로운 조건식을 이행성규칙에 따라 생성하고 이 조건식을 이용하여 최적화를 수행
- <color blue>원래의 조건식에서는 인덱스를 사용하지 못하게 되었더라도 인덱스를 사용하는 실행계획이 나타날 수 있다</color>
- 조건식 형식
WHERE column1 comparison_operators constant AND column1 = column2
- comparison_operators : =, !=, ^=, <, <>, >, ⇐, >= 중 하나
- constant : 연산, SQL 함수, 문자열, 바인드 변수, 상관관계 변수를 포함하는 상수 수식
이행성 규칙 예1
- <color blue>비용기준 업티마이져를 사용할 때만 적용</color>
SELECT * FROM emp e, dept d WHERE e.deptno = 20 AND e.deptno = d.deptno;
- 만약 e.deptno 인덱스가 없었다면, EMP테이블을 전체 테이블 액세스를 하면서 매번 dept 테이블 연결
- 이행성 규칙에 의해 실행계획이 DEPT 테이블을 먼저 인덱스로 액세스하는 실행계획이 가능
비교하는 대상이 상수 수식이 아닌 컬럼인 경우는 이행이 일어나지 않음
WHERE column1 comparison_operators column3 AND column1 = column2
이행성 규칙 예2 - OR조건을 가진 UNION ALL 사용
- OR를 가지는 조건들을 UNION ALL을 사용한 복합 문장으로 변환하는 경우이다
- UNION ALL로 각각의 인덱스를 경유하는 실행계획을 수립하고 이를 결합
변환기준
- OR를 사용한 조건절을 분기시켰을 때 각각이 인덱스 접근 경로로 이용할 수 있다면 변환을 수행
- 인덱스 사용불가로 전체 테이블을 스캔 하거나, OR 조건이 검증기능만 수행하면 변환하지 않음
- 즉, 분기된 각각의 액세스가 불필요한 범위를 액세스하지 않는다고 판단한 경우에만 적용
실행계획
- IN-LIST ITERATOR나 CONCATENATION으로 실행계획이 나타남
- 강제적인 적용을 위해 ‘USE_CONCAT’ 힌트를 사용.
- 함부로 사용하면 액세스가 불필요하게 분기되어 오히려 처리량이 크게 증가
뷰병합(View Merging)
사용자 정의 바인드 변수의 엿보기(Peeking)
study/oracle/datadb/2week_1/chap4.1273738085.txt.gz · 마지막으로 수정됨: 저자 starlits
