GOLDILOCKS 는 사용자의 SQL 구문에 대해 가장 효율적으로 처리할 수 있는 실행 계획을 찾는 모듈인 QUERY OPTIMIZER 를 제공합니다.
QUERY OPTIMIZER 는 Access Paths, Join Methods, Query Transformations, 통계정보등을 이용하여 다양한 형태의 PLAN 의 비용을 계산(Cost-Based Optimizer)한 뒤, 가장 적은 비용을 갖는 PLAN 을 선택합니다.
Access Paths, Join Methods, Query Transformations, 통계정보 에 대해서 알아보겠습니다.
Query Transformations
조건 구문을 View 로 Push 하는 기능 혹은 SubQuery 를 Join 형태로 변환하는 기능을 수행합니다.
Query Transformations 은 Heuristic Query 와 Cost-Based Query 로 나뉘어집니다.
Heuristic Query Transformations
Query 를 변형하는 것이 변형하지 않은 것보다 항상 효율적인 경우에 대한 Transformation 을 수행하는 것을 의미합니다.
Cost-Based Query Transformation
Query 를 변형하는 것이 항상 효율적이지 않은 경우 변형 전후의 비용을 계산하여 효율적인 형태를 찾아 결정하는 것을 의미합니다.
Query Transformations 에 대해 GOLDILOCKS 는 다음의 기법을 제공합니다.
- Simple View Merging
- Filter Push Down
- SubQuery Unnesting
- Single Table Min/Max Aggregation Conversion
- Rewrite Target on Exists
기법 명칭 |
설명 |
Simple View Merging |
Simple View 를 상위 쿼리에 합병하는 기능 |
Filter Push Down |
WHERE 절에 존재하는 조건 중 FROM 절에 기술한 SubQuery 에 적용 가능한 조건을 적용하는 기능 |
SubQuery Unnesting |
조건절에 존재하는 SubQuery 를 Join 형태로 풀어내는 기능 |
Single Table Min/Max Aggregation Conversion |
단일 테이블에 대해 최대/최소 값을 요구하는 질의에 대해 해당 컬럼에 대한 INDEX 가 존재하는 경우 INDEX 를 이용하여 결과를 반환하는 기능 |
Rewrite Target On Exists |
EXISTS 혹은 NON EXISTS 연산에 존재하는 SubQuery 의 출력값을 상수값으로 변환하는 기능 |
Access Paths
단일 테이블에 대한 접근 방법을 의미합니다.
Access Paths 에 대해 GOLDILOCKS 는 다음의 기법을 제공합니다.
- Table Access
- Index Access
- Rowid Access
- Index Concat
기법 명칭 |
설명 |
Table Access |
저장된 테이블 그대로를 Scan 하는 방식 |
Index Access |
테이블에 대한 검색시 Index 를 이용하여 Scan 하는 방식 |
Rowid Access |
테이블에 대한 검색시 RowID 를 이용하여 해당 페이지에 직접 접근하는 방식 |
Index Concat |
WHERE 절에 OR 이 존재하고 OR 에 의해 나누어진 조건이 각각 Index Access 가 가능한 경우 Index Access 의 결과를 통합하여 하나의 결과로 만드는 방식 |
Join Methods
두 테이블의 Join 연산 방법을 의미합니다.
Join Methods 에 대해 GOLDILOCKS 는 다음의 기법을 제공합니다.
- Nested Loops Join
- Sort Merge Join
- Hash Join
- Join Concat
기법 명칭 |
설명 |
Nested Loops Join |
Inner Node, Outer Node 에 별도의 INSTANT 를 생성하지 않고 Join 을 수행하는 방식 |
Sort Merge Join |
Inner Node 와 Outer Node 의 데이터를 Join 조건에 해당하는 컬럼으로 정렬한 다음 순차적으로 비교하며 Join 결과를 반환하는 방식 |
Hash Join |
Inner Node 에 Hash Instant 를 생성하여 Join 을 수행하는 방식 |
Join Concat | Join 조건에 OR 이 존재하고 OR 에 의해 나누어진 Join 조건들이 각각 별도의 Join 으로 처리되어 결과를 하나로 통합하는 방식 |
통계정보
- 테이블 통계정보
- 컬럼 통계정보
- 인덱스 통계정보
통계정보 |
정보에 포함된 내용 |
테이블 통계정보 |
데이터 개수 |
컬럼 통계정보 |
서로 다른 값의 개수 NULL 값의 개수 값의 평균 길이 최소값 최대값 |
인덱스 통계정보 |
서로 다른 KEY 의 개수 |
위의 기법들은, GOLDILOCKS 엔진에서 혹은 사용자가 직접 지정할 수 있습니다.
기법별로 사용제약사항이 있지만, 너무 지저분해 질거같아 작성하지 않았습니다.
위의 내용은 다양한 쿼리를 경험해 보면서 쌓아가야 할 지식입니다.
각 기법별로 어느 쿼리에서 어떻게 사용해야 더 좋은 성능을 내는지는, GOLDILOCKS 에서 많은 쿼리를 사용해보시길 바랍니다.
'Database > Goldilocks' 카테고리의 다른 글
[GOLDILOCKS] SQL 쿼리 HINT 사용해보기 (0) | 2018.05.22 |
---|---|
[GOLDILOCKS] 조인, Cross Join, Inner Join, Outer Join, Semi Join, Anti-Semi Join 알아보기 (0) | 2018.05.22 |
[GOLDILOCKS] SQL 함수 사용해보기 (0) | 2018.05.21 |
[GOLDILOCKS] 테이블 IDENTITY 컬럼 제약사항 및 사용해보기 (0) | 2018.05.18 |
[GOLDILOCKS] 데이터 타입 알아보기 (0) | 2018.05.18 |