1. Flattened(Unnest subqueries)
Join으로 변환후, Join으로서 처리
- 직접 Join 사용 경우와 차이 발생 가능(조인순서, 연산 방법 등의 차이 발생)
2. 언제 Subquery를 사용할까?
① Semi Join
한쪽 테이블만 SELECT 결과 집합으로 요구
다른 쪽 테이블은 데이터를 체크하는 선택(selection)연산만 수행
- Subquery로 작성해서 최적화 작업
ex) SELECT DISTINCT ID FROM DATA A INNER JOIN DAT B ON A.ID = B.ID
=> SELECT ID FROM DATA A WHERE EXISTS(SELECT * FROM DAT B WHERE B.ID = A.ID)
② TOP 절 등을 이용 결과 집합이 일부로 제한되는 경우
③ 데이터 가공(선 처리)후 Join이나 기타 연산 수행 시
④ Subquery 고유 문법이나 기능이 필요한 경우
3. 파생테이블, CTE, APPLY 활용
성능 좋은 고급 쿼리 적용 예
① 중복 I/O 제거 -"같은 데이터는 2번 이상 중복해서 읽지 않는다"
⒜ 파생테이블/CTE + JOIN으로 변경
⒝ 기준 결과 집합 선 처리 후 결합(FROM 안에서 조인후 SELECT 절에서 가공한다.)
⒞ 행 복제
② 연산 순서 조정 - 더 나은 순서로 연산 처리
결합(Join, Subquery)전 Grop 먼저
ex) (거래 데이터 * 코드 테이블) => 집계 VS (거래 데이터 => 집계) * 코드 테이블
4. CASE 내부 Subquery 주의
CASE문 안에 SELECT 서브 쿼리 사용시 WHEN 절의 개수만큼 테이블에 반복해서 엑세스가 일어남 SELECT 안에서 CASE 문 사용시 테이블을 한번만 읽는다.
ex) SELECT ID, CASE(SELECT ID FROM DATA... => SELECT ID, (SELECT CASE ID WHEN 'Germany'...
'IBSHEET' 카테고리의 다른 글
쉽게 이해할 수 있는 OLTP와 OLAP성 쿼리의 차이 (0) | 2023.06.18 |
---|---|
성능 좋은 SQL 쿼리 작성법(차집합 NOT IN, CTE 재귀 호출 활용, 쿼리 힌트 사용 주의) (0) | 2023.06.18 |
성능 좋은 SQL 쿼리 작성법(JOIN) (0) | 2023.06.17 |
[mysql] 조회, Index냐 Full Scan이냐 (0) | 2023.04.18 |
ANSI 표준 (0) | 2023.04.18 |
댓글