프린트 하기

 

서적 명 : The Logical Optimizer

 

책소개

SQL의 성능 향상의 목적으로 재작성을 하지만, 옵티마이져로 인하여 성능이 오히려 저하되기도 한다. 옵티마이져가 SQL을 직접 변경 함으로써 SQL의 성능에 미치는 영향은 지대하지만, 그 동안 이것을 전반적으로 다룬 책은 없었다. 이 책은 Logical Optimizer의 한계로 인해 발생하는 성능 문제를 해결하고자 하며, 성능향상을 위한 SQL 수정을 튜너가 아닌 옵티마이져에게 시키는 방법, 변경된 실행계획을 정확히 읽어내는 능력을 기를 수 있게 한다.

 

목차

Episode
Prologue
감사의 글
누구를 위한 책인가
책을 효율적으로 마스터하는 방법
책의 구성

Part 1 - Query Transformation Concept

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

Part 2 - Heuristic Query Transformation

들어가기
2.AHeuristic Query Transformation이란?
2.1 CSE (Common Subexpression Elimination): Where 절에서 or 사용시 중첩된 조건절은 제거하라
2.2JE(Join Elimination) : 직접 사용하지 않는 테이블은 SQL에서 삭제하라
2.3OE (Outer Join Table Elimination) : 불필요한 Outer쪽 테이블은 삭제하라
2.4OJE(Outer-Join Elimination) : 의미 없는 Outer 조인을 Inner 조인으로 바꾸어라
2.5OBYE(Order By Elimination) : 불필요한 Order By를 삭제하라
2.6DE (Distinct Elimination) : 불필요한 Distinct를 제거하라
2.7 CNT(Count(column) To Count(*)):Count(컬럼) 사용시 해당 컬럼이 Not Null인 경우 Count(*)로 대체하라
2.8FPD (Filter Push Down) : 조건절을 인라인뷰 내부로 이동시켜라
2.9TP* (Transitive Predicate) : 조인절을 이용하여 다른 테이블에 상수조건을 생성시켜라
2.10SVM (Simple View Merging) : Simple View를 해체하여 메인 쿼리와 통합하라
2.11LV*(Lateral View) : 뷰를 Scalar 서브쿼리처럼 사용하라
2.12FOJC* (Full Outer Join Conversion) : Full Outer 조인을 Union All로 변경하라
2.13NFOJ* (Native Full Outer Join) : Full Outer 조인시 중복 Scan되는 테이블을 제거하라
2.14OT* (Operator Transformation) : 특정 연산자를 다른 연산자로 변환하라
2.15PM(Predicate Move Around): Where 조건을 다른 뷰에 이동시켜라
2.16 WCOTR* (Where Current Of To Rowid) : Where Current Of 를 사용하여 Index Scan을 회피하라

Heuristic Query Transformation for Subquery

2.17SSU(Simple Subquery Unnesting) : 단순 서브쿼리를 조인으로 바꾸어라
2.18 CRSW (Correlated Removal Subquery Using Window Function): 상관 서브쿼리를 사용할 때 분석함수를 사용할 수 있는 경우 서브쿼리를 제거하라
2.19 URSW (Uncorrelated Removal Subquery Using Window Function): 분석함수를 사용할 수 있는 경우 비상관 서브쿼리를 제거하라
2.20SJ (Semi Join) : 서브쿼리를 Semi 조인으로 변환하라
2.21AJ (Anti Join) : 부정형 서브쿼리를 Anti 조인으로 바꾸어라
2.22 ANTI NA(Anti Join Null Aware) : Null 허용 컬럼으로 서브쿼리와 조인시 Anti 조인이 가능하다
2.23OJTAJ*(Outer Join to Anti Join) : Outer 조인을 Anti 조인으로 변환하라
2.24 EJE*(Enhanced JE): Semi / Anti 조인과 ANSI Style로 조인 할 경우도 JE가 가능하다
2.25JESJ*(Join Elimination Using Self Join): Self Join 사용시에도 JE가 가능하다
2.26SSTS*(Scalar Subquery To Subquery): 스칼라 서브쿼리를 서브쿼리로 변환하라
2.27SQC (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.30PC* (Pivot Conversion) : Pivot 절을 Case + Group By로 변환하라
2.31GBEP* (Group By Extension Pruning) : 불필요한 Rollup 이나 CUBE를 삭제하라
2.32 GSTT* (Grouping Sets Using Temp Table): Grouping Sets 사용시 Temp 테이블에 적재후 이를 반복해서 이용하라
2.33GSTU* (Grouping Sets To UNION): Grouping Sets를 UNION ALL로 변환하라
2.34GSTR*(Grouping Sets To Rollup): Grouping Sets을 Rollup으로 변환하라
2.BPart 2를 마무리 하며

Part 3 - Cost Based Query Transformation

들어가기
3.ACost Based Query Transformation이란 무엇인가
3.BSearch Type과 Iteration이란 무엇인가
3.1CBPPD*(Cost Based Predicate Push Down) : Complex View에 Filter를 밀어 넣어라
3.2PPU(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.6SJC (Set To Join Conversion) : 집합연산을 조인으로 바꾸어라
3.7CSU (Complex Subquery Unnesting) : 복잡한 서브쿼리를 조인으로 바꾸어라
3.8CVM( Complex View Merging ) : Distinct나 Group By가 있는 뷰를 해체하라
3.9JPPD Union View: Union을 사용한 뷰에 조인 조건을 침투시켜라
3.10JPPD Union All View: Union All을 사용한 뷰에 조인 조건을 침투시켜라
3.11JPPD Outer Join View: 뷰에 Outer 조인을 사용한 경우 조인 조건을 침투 시켜라
3.12 Multi Level JPPD: 뷰 내부에 또 다른 뷰가 있더라도 메인 쿼리의 조인 조건을 침투 시켜라
3.13 JPPD Extension: Distinct 나 Group By, Semi/Anti-join을 사용한 뷰에 조인 조건을 침투시켜라
3.14GBP (Group By Placement) : Group By를 먼저 수행하고 Join 하라
3.15GBPD (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.CPart 3을 마무리 하며

Part 4 - Cost Based Query Transformation Internal

들어가기
4.1Search Type의 개념과 종류
4.2Search Type 분석에 사용될 SQL
4.3Exhaustive Type 전략
4.4Iterative Type 전략
4.5Linear Type 전략
4.6Two_Pass Type 전략
4.7Off Option 전략
4.8On Option 전략
4.9State Space란 무엇인가
4.10CA*(Cost Annotation)란 무엇인가
4.11메모리 관리
4.12Interleaving: 선 변환 과정이 끝나면 후 변환 과정을 연이어 수행하라
4.13Juxtaposition: 배타적인 변환을 동시에 고려하여 Cost가 낮은 것을 선택하라
4.14실무에 적용하기
4.APart 4를 마무리 하며

부록과 색인
실무에서의 Query Transformation 이슈
미해결 과제
Epilogue
Bibliography
Index

[예스24 제공]