책뿌수기 - SQL 레벨업 7
Contents
7. 서브쿼리(곤란한 부분은 분할해야만 할까?)
ch 21. 서브쿼리가 일으키는 폐해
1) 서브쿼리의 문제점
- 성능적 문제는 서브쿼리가 실체적인 데이터를 저장하고 있지 않다는 것에 있다.
(1) 연산 비용 추가
- 서브쿼리 = SELECT 이므로 실행할때마다 SELECT 하는 것
(2) 데이터 I/O 비용 발생
- 연살결과가 커 저장소를 쓰게 되는 경우 급격한 속도 저하 발생
(3) 최적화를 받을 수 없음
- 서브쿼리의 결과에는 메타 정보가 없어 최적화가 불가능
2) 서브쿼리 의존증
(1) 서브쿼리를 사용한 방법
- 코드가 복잡해 읽기 어렵다
- 성능
- 결과가 일시적인 영역에 확보되므로 오버헤드 발생
- 최적화 불가
- 결합을 필요로 하기 때문에 비용이 높고 실행계획 변동 리스크가 존재
- recipts 테이블 두번 스캔 필요
(2) 상관 서브쿼리는 답이 될 수 없다
- 어쨋든 테이블에 2번 접근해야 한다
(3) 윈도우 함수로 결합 해결
- 목표는 테이블 접근 1회로 줄이기
- ROW_NUMBER를 사용해 구매 이력 번호를 붙이고, 이력이 1인 레코드 추출
3) 장기적인 관점에서의 리스크 관리
- 결합을 사용한 쿼리의 불안정 요소(상관 서브쿼리도 유사)
- 결합 알고리즘의 변동 리스크
- 환경 요인에 의한 지연 리스크(인덱스, 메모리, 매개변수 등)
(1) 알고리즘 변동리스크
- 상황에 따라 변하는 결합 알고리즘
(2) 환경 요인에 의한 지연 리스크
- 결합을 사용한다는 것 = 장기적인 관점에서의 리스크 증가
4) 서브쿼리 의존증 - 응용편
(1) 다시 서브쿼리 의존증
(5) 서브쿼리는 정말 나쁠까?
- 생각하기는 쉬우나 RDB와는 맞지 않다
ch 22. 서브쿼리 사용이 더 나은 경우
- 결합쿼리는 최대한 결합 대상 레코드수를 줄이는 것이 중요한데, 옵티마이저가 잘 판단하지 못하는 경우 직접 연산 순서를 명시하는 용도로 힌트 사용
1) 결합과 집약 순서
(1) 두 가지 방법
- 1. 결합 -> 집약
- 2. 집약 -> 결합
(2) 결합 대상의 레코드 수
- 2의 경우 레코드수가 줄기 때문에 더 나은 선택일 수 있다(사전에 결합 레코드수 압축)
Author Jaejin Jang
LastMod 2019-01-31
License Jaejin Jang