'최적의 SQL'에 해당되는 글 1건

  1. 2016.12.10 최적의 SQL 작성
2016. 12. 10. 23:55

최적의 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작성시 고려해야 할부분에 대해서 간단하게 알아보았습니다.

다음에는 항목별로 더 자세하게 알아보도록 하겠습니다.

Posted by dlfma1985