THE LOGICAL OPTIMIZER
Logical Optimizer는 성능 향상의 목적으로 SQL을 재작성(변경)합니다. 하지만 옵티마이져가 완벽하지 못하므로 많은 경우에 성능저하를 일으키게 됩니다.

옵티마이져가 SQL을 직접 변경 함으로써 SQL의 성능에 미치는 영향은 지대하지만 전세계적으로 이것을 전반적으로 다룬 서적이 없다는 점과 Logical Optimizer의 한계로 인해 발생하는 성능 문제를 해결하기 위해 본서가 출간되었습니다.

아래와 같은 경험이 있는 분들에게 추천 합니다.
- 조인 방법과 조인 순서가 올바르지 못하다.
- 인덱스를 사용하지 않는다.
- 힌트를 사용하였지만 의도대로 되지 않는다.
- 실행계획의 모습이 이상하다.
- 성능이 저하되는 원인을 찾기 힘들다.

이러한 모든 의문점 뒤엔 Logical Optimizer라는 비밀의 벽이 있습니다. 그 벽을 넘는 순간 위에서 언급된 문제들을 해결할 수 있는 능력을 갖추게 됨은 물론이고 SQL을 보는 눈이 달라질 것입니다. 마치 SF 영화 <매트릭스>의 위대한 예언자인 Oracle의 눈처럼. (본문 내용 중에서)

Part 1 - Query Transformation Concept
1.1 Logical Optimizer(Transformer)란 무엇인가
1.2 Query Transformation을 알아야 하는 이유
1.3 Query Transformation의 개념
1.4 Query Transformer의 구조
1.5 DBMS_XPLAN.DISPLAY_CURSOR
1.6 내가 사용한 Hint가 무시되는 이유
1.7 10053 Event Trace

Part 2 - Heuristic Query Transformation 
2.A Heuristic Query Transformation이란?
2.1 CSE (Common Subexpression Elimination): Where 절에서 or 사용시 중첩된 조건절은 제거하라
2.2 JE(Join Elimination) : 직접 사용하지 않는 테이블은 SQL에서 삭제하라
2.3 OE (Outer Join Table Elimination) : 불필요한 Outer쪽 테이블은 삭제하라
2.4 OJE(Outer-Join Elimination) : 의미 없는 Outer 조인을 Inner 조인으로 바꾸어라
2.5 OBYE(Order By Elimination) : 불필요한 Order By를 삭제하라
2.6 DE (Distinct Elimination) : 불필요한 Distinct를 제거하라
2.7 CNT(Count(column) To Count(*)):Count(컬럼) 사용시 해당 컬럼이 Not Null인 경우 Count(*)로 대체하라
2.8 FPD (Filter Push Down) : 조건절을 인라인뷰 내부로 이동시켜라
2.9 TP* (Transitive Predicate) : 조인절을 이용하여 다른 테이블에 상수조건을 생성시켜라
2.10 SVM (Simple View Merging) : Simple View를 해체하여 메인 쿼리와 통합하라
2.11 LV*(Lateral View) : 뷰를 Scalar 서브쿼리처럼 사용하라
2.12 FOJC* (Full Outer Join Conversion) : Full Outer 조인을 Union All로 변경하라
2.13 NFOJ* (Native Full Outer Join) : Full Outer 조인시 중복 Scan되는 테이블을 제거하라
2.14 OT* (Operator Transformation) : 특정 연산자를  다른 연산자로 변환하라
2.15 PM(Predicate Move Around):  Where 조건을 다른 뷰에 이동시켜라
2.16 WCOTR* (Where Current Of To Rowid) : Where Current Of 를 사용하여 Index Scan을 회피하라
    
Heuristic Query Transformation for Subquery
2.17 SSU(Simple Subquery Unnesting) : 단순 서브쿼리를 조인으로 바꾸어라
2.18 CRSW (Correlated Removal Subquery Using Window Function): 상관 서브쿼리를 사용할 때 분석함수를 사용할 수 있는 경우 서브쿼리를 제거하라
2.19 URSW (Uncorrelated Removal Subquery Using Window Function): 분석함수를 사용할 수 있는 경우 비상관 서브쿼리를 제거하라
2.20 SJ (Semi Join) : 서브쿼리를 Semi 조인으로 변환하라
2.21 AJ (Anti Join) : 부정형 서브쿼리를 Anti 조인으로 바꾸어라
2.22 ANTI NA(Anti Join Null Aware) : Null 허용 컬럼으로 서브쿼리와 조인시 Anti 조인이 가능하다
2.23 OJTAJ*(Outer Join to Anti Join) : Outer 조인을 Anti 조인으로 변환하라
2.24 EJE*(Enhanced JE): Semi / Anti 조인과 ANSI Style로 조인 할 경우도 JE가 가능하다
2.25 JESJ*(Join Elimination Using Self Join): Self Join 사용시에도 JE가 가능하다
2.26 SSTS*(Scalar Subquery To Subquery): 스칼라 서브쿼리를 서브쿼리로 변환하라
2.27 SQC (Subquery Coalescing): 불필요하게 분리되어 있는 서브쿼리를 하나로 통합하라
2.28 DSJ (Driving Semi Join): Semi Join을 Bitmap 인덱스를 이용하여 Driving 테이블로 바꾸어라
2.29 SJR*, AJR*(Hash Join Right Semi/Anti) : Hash Semi/Anti Join 시 사용되는 서브쿼리 집합을 Build Input 집합으로 변환하라
 
Heuristic Query Transformation for Data Warehouse
2.30 PC* (Pivot Conversion) : Pivot 절을 Case + Group By로 변환하라
2.31 GBEP* (Group By Extension Pruning) : 불필요한 Rollup 이나 CUBE를 삭제하라
2.32 GSTT* (Grouping Sets Using Temp Table): Grouping Sets 사용시 Temp 테이블에 적재후 이를 반복해서 이용하라
2.33 GSTU* (Grouping Sets To UNION): Grouping Sets를 UNION ALL로 변환하라
2.34 GSTR*(Grouping Sets To Rollup): Grouping Sets을 Rollup으로 변환하라
Part 2를 마무리 하며
  
Part 3 - Cost Based Query Transformation
3.A Cost Based Query Transformation이란 무엇인가
3.B Search Type과 Iteration이란 무엇인가
3.1 CBPPD*(Cost Based Predicate Push Down) : Complex View에 Filter를 밀어 넣어라
3.2 PPU(Predicate Pull Up) : 비용이 많이 드는 조건절을 뷰 외부로 이동시켜라
3.3 OR-Expansion(OR To Union All Conversion) : OR 조건을 이용하여Union All로 변경시켜라
3.4 OR-Expansion Using Function*(NVL, DECODE, RANK To Union All): NVL, DECODE, RANK 함수를 사용한 조건절을 이용하여 Union All로 변경하라
3.5 TE (Table Expansion): 여러 개의 파티션을 액세스 할 때 파티션 마다 Union All로 분리해서 Index scan을 할지 FTS를 할지 판단하라
3.6 SJC (Set To Join Conversion) : 집합연산을 조인으로 바꾸어라
3.7 CSU (Complex Subquery Unnesting) : 복잡한 서브쿼리를 조인으로 바꾸어라
3.8 CVM( Complex View Merging ) : Distinct나 Group By가 있는 뷰를 해체하라
3.9 JPPD Union View: Union을 사용한 뷰에 조인 조건을 침투시켜라
3.10 JPPD Union All View: Union All을 사용한 뷰에 조인 조건을 침투시켜라
3.11 JPPD Outer Join View: 뷰에 Outer 조인을 사용한 경우 조인 조건을 침투 시켜라
3.12 Multi Level JPPD: 뷰 내부에 또 다른 뷰가 있더라도 메인 쿼리의 조인 조건을 침투 시켜라
3.13 JPPD Extension: Distinct 나 Group By, Semi/Anti-join을 사용한 뷰에 조인 조건을 침투시켜라
3.14 GBP (Group By Placement) : Group By를 먼저 수행하고 Join 하라
3.15 GBPD (Group By Push Down) : Parallel Query 수행 시 Group by를 한번 더 수행하라
3.16 JF(Join Factorization) : Union / Union All 사용시 공통으로 사용하는 테이블을 분리시켜라
3.17 ST ( Star Transformation ): From 절의 Dimension 테이블을 서브쿼리로 변환하고 DSJ 기능을 이용하여 Bitmap 연산을 수행하라
3.18 CBST (Cost Based Star Transformation): Star Transformation 적용시 Cost Based 환경을 이용하라
3.19 MVR(Materialized View Rewrite): Materialized View를 사용하지 않는 SQL을 Materialized View를 사용하는 SQL로 바꾸어라
3.20 JBE (Join Back Elimination) : Bitmap Join Index를 사용할 경우 필요 없는 테이블 액세스를 제거하라
3.C Part 3을 마무리 하며
  
Part 4 - Cost Based Query Transformation Internal  
4.1 Search Type의 개념과 종류
4.2 Search Type 분석에 사용될 SQL
4.3 Exhaustive Type 전략
4.4 Iterative Type 전략
4.5 Linear Type 전략
4.6 Two_Pass Type 전략
4.7 Off Option 전략
4.8 On Option 전략
4.9 State Space란 무엇인가
4.10 CA*(Cost Annotation)란 무엇인가
4.11 메모리 관리
4.12 Interleaving: 선 변환 과정이 끝나면 후 변환 과정을 연이어 수행하라
4.13 Juxtaposition: 배타적인 변환을 동시에 고려하여 Cost가 낮은 것을 선택하라
4.14 실무에 적용하기
4.A Part 4를 마무리 하며​