본문 바로가기
DB/SQLD & SQLP

[SQLP] 3장. 옵티마이저 원리 - 쿼리변환

by JiGyeong 2019. 3. 17.

쿼리 변환

1. 쿼리변환

쿼리 변환(Query Transformation)은, 옵티마이저가 SQL을 분석해 의미적으로 동일하면서도 더 나은 성능이 기대되는 형태로 재작성하는 것을 말함

2. 서브쿼리 Unnesting

  • 중첩된 서브쿼리(Nested Subquery)를 풀어내는 것을 말함

  • 서브쿼리를 메인쿼리와 같은 레벨로 풀어낸다면 다양한 액세스 경로와 조인 메소드를 평가할 수 있음

3. 뷰 Merging

  • 사람의 눈으로 볼 때는 쿼리를 블록화하는 것이 더 읽기 편할지 모르지만 최적화를 수행하는 옵티마이저의 시각에서는 더 불편함

  • <쿼리1>의 뷰 쿼리 블록은 액세스 쿼리 블록(뷰를 참조하는 쿼리 블록)과의 머지(merge) 과정을 거쳐 <쿼리2>와 같은 형태로 변환되는데, 이를 ‘뷰 Merging’이라고 함

<쿼리1>

select * from (select * from emp where job = ‘SALESMAN’) a , (select * from dept where loc = ‘CHICAGO’) b where a.deptno = b.deptno

<쿼리2>

select * from emp a, dept b where a.deptno = b.deptno and a.job = ‘SALESMAN’ and b.loc = ‘CHICAGO’

4. 조건절 Pushing

  • 뷰를 참조하는 쿼리 블록의 조건절을 뷰 쿼리 블록 안으로 밀어 넣는 기능

  • 조건절이 가능한 빨리 처리되도록 뷰 안으로 밀어 넣는다면, 뷰 안에서의 처리 일량을 최소화하게 됨은 물론 리턴되는 결과 건수를 줄임으로써 다음 단계에서 처리해야 할 일량을 줄일 수 있음

가. 조건절(Predicate) Pushdown

group by절을 포함한 아래 뷰를 처리할 때, 쿼리 블록 밖에 있는 조건절을 쿼리 블록 안쪽에 밀어 넣는 방법

나. 조건절(Predicate) Pullup

조건절을 쿼리 블록 안으로 밀어 넣을 뿐만 아니라 안쪽에 있는 조건들을 바깥 쪽으로 끄집어 내기도 하는데, 이를 ‘조건절(Predicate) Pullup’이라고 함. 그리고 그것을 다시 다른 쿼리 블록에 Pushdown 하는 데 사용함

다. 조인 조건(Join Predicate) Pushdown

조인 조건절을 뷰 쿼리 블록 안으로 밀어 넣는 것으로서, NL Join 수행 중에 드라이빙 테이블에서 읽은 조인 칼럼 값을 Inner 쪽(=right side) 뷰 쿼리 블록 내에서 참조할 수 있도록 하는 기능

5. 조건절 이행

(A = B)이고 (B = C)이면 (A = C)이다」 라는 추론을 통해 새로운 조건절을 내부적으로 생성해 주는 쿼리변환

6. 불필요한 조인 제거

1:M 관계인 두 테이블을 조인하는 쿼리문에서 조인문을 제외한 어디에서도 1쪽 테이블을 참조하지 않을 때, 옵티마이저는 이 특성을 이용해 M쪽 테이블만 읽도록 쿼리를 변환하는데, 이를 ‘조인 제거(Join Elimination)’ 또는 ‘테이블 제거(Table Elimination)’라고 한다.

7. OR 조건을 Union으로 변환

select * from emp where job = ‘CLERK’ or deptno = 20

Full Table Scan 으로 처리될 위 쿼리를

select * from emp where job = ‘CLERK’ union all select * from emp where deptno = 20 and LNNVL(job=’CLERK’)

job과 deptno에 각각 생성된 인덱스를 사용하도록 바꿀수 있다.

8. 기타 쿼리 변환

가. 집합 연산을 조인으로 변환

Intersect나 Minus 같은 집합(Set) 연산을 조인 형태로 변환하는 것을 말함

나. 조인 칼럼에 IS NOT NULL 조건 추가
다. 필터 조건 추가

필터 조건을 추가해 주면 불필요한 테이블 액세스 및 조인 시도를 줄일 수 있음

라. 조건절 비교 순서

옵티마이저는 비교 연산해야 할 일량을 고려해 선택도가 낮은 칼럼의 조건식부터 처리하도록 내부적으로 순서를 조정