조건절 이행이란
- 이 쿼리 변환을 한마디로 요약하면, [ (A=B) 이고 (A=C) 이다 ]는 추론을 통해 새로운 조건절을
내부적으로 생성해 주는 쿼리변환이다. [(A>B) 이고 (B>C)이면 (A>C)이다]와 같은 추론도
가능하다.
- 새로운 필터 조건이 추가되면서 조인 조건이 사라진다. 새로운 필터 조건으로 인하여
조인 조건이 필요가 없어졌다고 생각하고 옵티마이저가 중복 산정하는 것을 방지하기 위해
그렇게 처리하는 것이다.
- 9i에서는 사용자가 의도적으로 조인문을 한 버 기술하면 이 조인문이 다시 나타났는데,
10g부터는 아무리 여러 번 기술하더라도 그런 현상이 생기지 않는다.
- 만약 조건절 이행이 작용해 조인 조건이 사라지고 이로 인해 비용이 잘못 계산되는 문제가
생긴다면, 사용자가 명시적으로 새로운 필터조건을 추가하거나 조인문을 가공하는 방법을
사용해 볼 수 있다. 그러면 조건절이 사라지지 않고 그대로 남게 되며, 계산된 비용도
달라진다.
조인문 가공 방법 예시 ) d.deptno = e.deptno + 0
조건절 이행이 효과를 발휘하는 사례
- 내부적으로 조건절 이행이 여러 곳에서 일어나고 있다.
- 선분 이력을 between 조건으로 조회할 때는 인덱스 구성과 검색 범위에 따라
인덱스 스캔 효율에 많은 차이가 생긴다. 그에 따라 아래와 같은 쿼리에서도 범위를
더 제한적으로 줄일 수 있다.
SQL 예시)
select *
from 상품이력 a. 주문 b
where b.거래일자 between '20090101' and '20090131'
and a.상품번호 = b.상품번호
and b.거래일자 between a.시작일자 and a.종료일자
- 위의 쿼리에서는 아래와 같이 조건절을 명시적으로 추가해 줌으로써 SQL을 튜닝하곤 했다.
● 상품이력, 시작일자 <= '20090131'
● 상품이력, 종료일자 >= '20090101'
- 하지만 9i 부터는 옵티마이저가 이들 조건을 묵시적으로 추가하고 최적화를 수행한다.
( 8i 버전을 사용하고 있다면 위와 같은 조건절을 명시적으로 추가해 주는 튜닝 기법이
여전히 유효하다 )
튜닝사례 1
- 조인 조건은 아니지만 커럶 간 관계 정보를 통해 추가적인 조건절이 생성되었다.
옵티마이저에게 많은 정보를 제공할수록 SQL 성능이 더 좋아진다.
( ip 사례 )
튜닝사례 2
- 최적의 조인순서를 결정하고 그 순서에 따라 조인문을 기술해주는 것이 매우 중요
'ORACLE > SQLP' 카테고리의 다른 글
성능고도화 4-7. Or-expansion (0) | 2016.12.26 |
---|---|
성능고도화 4-6. 조인제거 (0) | 2016.12.26 |
성능고도화 4-4. 조건절 Pushing (0) | 2016.12.26 |
성능고도화 4-3. 뷰 Merging (0) | 2016.12.26 |
성능고도화 4-2 서브쿼리 Unnesting (1) | 2016.12.26 |