오라클 성능고도화 2권
Chap04. 01 쿼리 변환이란?
Tech_Wave
2021. 8. 12. 15:31
- 우리가 작성한 SQL에서 결과는 같더라도 서로 다르게 작성할 수 있습니다.
- 하지만 결과가 동일하더라도 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 변환이 안일어난다고 가정)
애초에 가장 좋은 성능을 낼 수 있는 형태로 쿼리를 작성하면 좋겠지만 쿼리 최적화 원리를 이해하고 작성하는 개발자는 흔하지는 않을꺼 같습니다.
그러기에 비용기반 옵티마이저는 최적화(Optimization) 단계 때 최적화에 유리한 형태로 SQL을 재작성을 하는 작업을 먼저합니다.
Oracle SQL처리과정

- 비용기반 옵티마이저의 서브 엔진으로서 Query Transformer,Estimator, Plan Generator가 있다고 설명했는데, 이 중 Query Transformer가 사용자가 작성한 SQL을 최적화에 유리한 형태로 재작성을 해주게 됩니다.
- 쿼리변환(Query Transformation)은, 쿼리 옵티마이저가 SQL을 분석해 의미적으로 동일하면서도 더 나은 성능이 기대되는 형태로 재작성하는 것을 말합니다.
[ Query 변환의 종류 ]
1) 서브쿼리 Unnesting
2) 뷰 Merging
3) 조건절 Pushing
4) 조건절 이행
5) 공통 표현식 제거
6) Outer 조인을 Inner 조인으로 변환
7) 실체화 뷰 쿼리로 재작성
8) Star 변환
9) Outer 조인 뷰에 대한 조인 조건 Pushdown
10) OR-Expansion
[ 쿼리 변환 방식 ]
- 휴리스틱(Heuristic) 쿼리 변환 : 결과만 보장된다면 무조건 쿼리 변환을 수행합니다.
- 일종의 규칙기반(Rule-based)최적화 기법이라고 할 수 있으며, 경험적으로 (최소한 동일하거나) 항상 더 나은 성능을 보일 것이라는 옵티마이저 개발팀의 판단이 반영된 것입니다.
- 비용기반(Cost-Based) 쿼리 변환 : 변환된 쿼리의 비용이 더 낮을 때만 그것을 사용하고, 그렇지 않을 때는 원본 쿼리 그대로 두고 최적화를 수행합니다.
반응형