최적의 SQL 작성을 위해 알아야 할 것들을 정리 해볼려고 합니다.
보통 SQL 작성을 하면 어떻게 수행될지 보다는 결과가 잘 나오는지에 대해 중점을 두고 SQL을 작성 해왔습니다.
그렇다면 이제 부터는 어떻게 수행되지 더 나아가 어떻게 수행되야 최적의 SQL인지에 대해서 알아보도록 하겠습니다.
1. 최적의 SQL 작성시 고려사항
- 옵티마이져 (Optimizer)
- 통계 (Statististic)
- 실행계획 (Execution Plan)
- 인덱스 (Index)
- 조인방법 (Join Method)
- 조인순서 (Join Order)
- 조인 연결고리 (Join Link)
- 집합적 사고
- 인라인 뷰 (Inline View)
- 서브쿼리 (SubQuery)
- 저장형 함수 (Stored Function)
- 스칼라 서브쿼리 (Scalar subquery)
- 계층형 쿼리
고려사항에 대해서 나열해보았습니다.
이중 기본적이라고 생각하는 몇가지에 대해서 정리 해보도록 하겠습니다.
2. 실행계획 (Execution Plan)
- 옵티마이져가 쿼리 실행시 어떻게 처리 하겠다는 계획 입니다.
- 옵티마이져의 한계로 인해 사용자가 생각하는 논리적인 판단과의 차이가 있을수 있습니다.
- 사용자가 생각했던 최적의 처리 경로와 옵티마이저가 생각한 최적의 경로 비교해보기
3. 조인방법 (Join Method)
- Nested Loops Join
> 순차적인 조인방식입니다.
- 선행적
- 종속적
- 랜덤액세스
- 선택적
- 연결고리 상태
- 방향성
- 부분범위 처리 가능
- 체크조건 영향력이 적음
- Sort Merge Join
> 정렬후 머지방식입니다.
- 동시적
- 독립적
- 전체범위처리
- 스캔방식
- 연결고리 상태 무관
- 무방향성
- 과다한 정렬작업
- Hash Join
> 해싱 함수 기법을 활용한 조인방식
- 독립적
- 연결고리 상태 무관
- 조인 전 필터링
- 적절한 메모리 지정필요
- 동치조인(Equijoin)만 가능
- 대량 범위 처리 유리
4. 조인 순서 (Join Order)
- Driving Table
> 먼저 처리되는 테이블을 의미합니다.
> 조건절에 있는 조건의 인덱스가 있어야 합니다.
> 처리범위가 적은 테이블이 드라이빙 되어야 최적화된 조인 오더라고 볼 수 있습니다.
- Driven Table
> 뒤에 처리되는 테이블을 의미합니다.
> 드라이빙 테이블로 부터 상수값을 공급받아 처리 됩니다.
> 연결고리를 통해 상수 값을 공급받게 됩니다.
> 연결고리에 인덱스가 존재해야 합니다. 또는 포함한 인덱스가 존재해도 됩니다.
5. 연결 고리 (Join Link)
- 조건절에서 조인에 참여하는 각 테이블의 컬럼 간 다양한 연산자로 연결되어 있는 부분을 연결고리라고 합니다.
( = , <> , >= , in ..)
- 연결고리 상태
> 양쪽 정상
= 조인 조건에 해당하는 인덱스가 양쪽에 있는 경우를 말합니다.
= 조인 오더에 상관없이 항상 인덱스를 사용
= 양쪽 연결고리가 정상일 경우 처리범위가 적은 테이블부터 드라이빙 되는 것이 유리 합니다.
> 한쪽 정상
= 조인 조건에 해당하는 인덱스가 한쪽에만 있는 경우를 말합니다.
= 논리적으로 연결고리가 비정상인 테이블(연결고리에 인덱스가 사용할 수 없는 테이블)에서
연결고리가 정상적인 테이블로의 조인오더는 양쪽 성상과 같이 문제가 되지 않습니다.
하지만, 반대의 경우로 수행이 될경우 성능상의 문제를 야기할 수 있습니다.
> 양쪽 이상
= 조인 조건에 해당하는 인덱스가 양쪽다 없는 경우를 말합니다.
= 대부분 Nested Loops 조인 형태 보다는 Hash Join으로 플리게 되는 경우가 많습니다.
6. 인라인 뷰 (Inline View)
- 인라인 뷰란 From 절 상에 오는 서브쿼리로서 View처럼 동작을 합니다.
- 적절한 크기의 중간집합을 생성하기 위하여 사용됩니다.
- 데이터 처리의 순서를 의도적으로 지정하기 위해 사용됩니다.
- 정상적이지 않은 데이터 구조를 연결하기 위해 사용됩니다.
- 실행계획의 제어를 위한 목적으로 사용됩니다.
7. 서브쿼리 (SubQuery)
- 메인쿼리에 종속되는 하위의 쿼리를 의미합니다.
- 종속의 의미는 반드시 메인쿼리의 집합 레벨을 변경할 수 없습니다.
- 메인쿼리는 서브쿼리의 모든 속성을 사용할 수 있습니다.
- 서브쿠리는 메인쿼리의 모든 속성을 사용할 수 있습니다.
- 대표적인 연산자로는 IN , EXISTS가 있습니다.
- 제공자형 서브쿼리
= 메인쿠리의 처리범위를 줄여줄 수 있을때 사용하면 좋습니다.
= 메인쿼리에 상수값을 공급하는 것과 동일한 효과를 얻을 수 있습니다.
= 서브쿼리로 부터 상수값을 공급받는 조건절의 조건에 인덱스가 필요합니다.
- 확인자형 서브쿼리
= 메인쿼리에서 산출된 결과과 다른 테이블의 조건을 만족하는지 여부를 확인하고자 할때 사용합니다.
= 만족하는 결과만 존재하면 처리를 더 이상 만족하는 로우를 찾지 않음으로 처리가 빠릅니다.
8. 정리
- 최적의 SQL은 결과 뿐만 아니라 성능이 보장된 SQL을 작성해야 합니다.
- SQL의 실행되는 과정을 먼저 생각하고 옵티마이져를 확인해 봐야 합니다.
- 데이터 모델을 참조해서 SQL을 작성해야 합니다.
- 드라이빙 테이블 선정시 처리 범위를 최소화 하는 조건을 만족하는 테이블을 선정합니다.
- SQL 작성시 10분만 생각하고 시작합니다.
최적의 SQL작성시 고려해야 할부분에 대해서 간단하게 알아보았습니다.
다음에는 항목별로 더 자세하게 알아보도록 하겠습니다.
'관심1 > 오라클' 카테고리의 다른 글
오라클 함수(형변환,문자) 알아보기 (0) | 2016.12.29 |
---|---|
오라클 힌트(Hint) 알아보기 (0) | 2016.12.11 |
오라클 DCL(Data Control Language) 알아보기 (0) | 2016.11.08 |
오라클 DDL(Data Definition Language) 알아보기 (1) | 2016.11.04 |
오라클 DML(Date Manipulation Language) 알아보기 (0) | 2016.10.31 |