우리가 작성하는 Query에서
결과는 같더라도 SQL문이 다르게 작성될 수 있습니다.
하지만 내부적으로는 어떤 형태로 작성하느냐에 따라 성능에 차이는 천차만별이죠.
[SQL 1]
SELECT *
FROM DEPT D
WHERE NOT EXISTS
(SELECT 'X'
FROM EMP
WHERE DEPTNO = D.DEPTNO);
[SQL 2]
SELECT D.*
FROM DEPT D, EMP E
WHERE E.DEPTNO(+) = D.DEPTNO
AND E.ROWID IS NULL;
위 Query의 결과는 같지만 수행 속도는 차이가 있을 수 있죠(Query 변환이 안일어난다고 가정)
처음부터 성능이 좋은 SQL을 작성하는 것이 좋지만
Query 최적화 원리를 이해하고 작성하는 개발자는 흔하지는 않을꺼같습니다.
그러기에 비용기반옵티마이저는 최적화(Optimization) 단계 때 최적화에 유리한 형태로
SQL을 재작성을 하는 작업을 먼저합니다.
(Oracle SQL처리과정 참조)
Optimizer가 최적화(Optimization) 단계에서
1. Query Transformer(쿼리변환) 진행하게 되는데
SQL을 분석해 의미적으로 동일(같은결과)하면서 더 나은 성능이
기대되는 형태로 재작성하는 것을 말합니다.
[ Query 변환의 종류 ]
1) 서브쿼리 Unnesting
2) 뷰 Merging
3) 조건절 Pushing
4) 조건절 이행
5) 공통 표현식 제거
6) Outer 조인을 Inner 조인으로 변환
7) 실체화 뷰 쿼리로 재작성
8) Star 변환
9) Outer 조인 뷰에 대한 조인 조건 Pushdown
10) OR-Expansion
10g부터 기준으로
1, 2, 7~10 -> 비용기반 쿼리 변환
3~6 -> 휴리스틱 쿼리 변환
[ 쿼리 변환 방식 ]
1) 휴리스틱(Heuristic) 쿼리 변환 : 결과만 보장된다면 무조건 쿼리 변환을 수행
일종의 규칙 기반 최적화 기법
2) 비용기반(Cost-Based) 쿼리 변환 : 변환된 쿼리의 비용이 더 낮을 때만 그것을 사용,
그렇지 않을 때는 원본 쿼리 그대로 두고 최적화를 수행
'오라클 성능고도화 2권' 카테고리의 다른 글
Chap04. 02 서브쿼리 Unnesting (0) | 2021.08.12 |
---|---|
Chap02. 07 조인을 내포한 DML 튜닝 (0) | 2021.08.10 |
Chap02. 06 스칼라 서브쿼리를 이용한 조인 (0) | 2021.08.09 |
Chap02. 05 Outer 조인 (0) | 2021.08.08 |
Chap02. 04 조인 순서의 중요성 (0) | 2021.08.08 |