Git :)

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. 친절한 SQL 튜닝
    IT 서적/친절한 SQL 튜닝 2023. 10. 21. 09:32

    인덱스 설계

    인덱스 스캔 방식에 여러 가지가 있지만, 가장 정상적이고 일반적인 방식은 Index Range Scan이다. 이를 위해서는 인덱스 선두컬럼을 반드시 조건절에 사용해야 한다. 아래 두 가지 선택 기준은 Index Range Scan을 하기 위해 필요한 조건으로서 공식처럼 외워야 한다.

    1. 조건절에 항상 사용하거나, 자주 사용하는 컬럼을 선정한다.
    2. '='조건으로 자주 조회하는 컬럼을 앞쪽에 둔다.

    소트 연산을 생략하기 위한 컬럼 추가

    인덱스는 항상 정렬상태를 유지하므로 ORDER BY, GROUP BY를 위한 소트 연산을 생략할 수 있게 해준다. 따라서 조건절에 사용하지 않는 컬럼이더라도 소트 연산을 생략할 목적으로 인덱스를 구성에 포함시킴으로써 개선을 도모할 수 있다.

    1. 소트 연산에 사용되는 컬럼을 인덱스로 설정
    2. equal ('=') 연산자로 사용한 조건절 컬럼 설정

    IN 조건은 '='이 아니다.

    SELECT 고객번호
          ,고객명
          ,거주지역
      FROM 고객
      WHERE 거주지역 = '서울'
        AND 혈액형 IN ('A', 'O')
      ORDER BY 연령

    위와 같은 쿼리문이 있을 때, IN 연산이 '=' 연산이 되려면 IN-List Iterator 방식으로 풀려야 한다. 아래와 같이..

    SELECT 고객번호
         , 고객명
         , 거주지역
      FROM 고객
      WHERE 거주지역 = '서울'
        AND 혈액형 = 'A'
        
    UNION ALL  
    
    SELECT 고객번호
         , 고객명
         , 거주지역
      FROM 고객
      WHERE 거주지역 = '서울'
        AND 혈액형 = 'O'
      ORDER BY 연령

    위와 같은 경우 ORDER BY가 아래 쿼리문에만 적용돼 있어 정확하게 정렬이 되지 않는다. 즉, 소트 연산을 생략하려면 IN 조건절이 IN-List Iterator 방식으로 풀려선 안 된다. ==> 인덱스를 수정해야 하는데, 운영계에서는 사용되는 DB의 인덱스를 변경하는 일은 쉬운 일이 아니다. IN 조건절을 인덱스 액세스 조건으로 사용하면 안된다. 필터 조건으로만 사용해야 한다.

     

    론 쿼리를 많이 짜본 사람은 아래와 같이 변형해서 정렬할 수 있다. SELECT 구문으로 묶고 ORDER BY를 하단에 추가했다.

    SELECT 고개번호
          ,고객명
          ,거주지역
      FROM (
            SELECT 고객번호
                 , 고객명
                 , 거주지역
                 , 연령
              FROM 고객
              WHERE 거주지역 = '서울'
                AND 혈액형 = 'A'
    
            UNION ALL  
    
            SELECT 고객번호
                 , 고객명
                 , 거주지역
                 , 연령
              FROM 고객
              WHERE 거주지역 = '서울'
                AND 혈액형 = 'O'
            )
    ORDER BY 연령

    'IT 서적 > 친절한 SQL 튜닝' 카테고리의 다른 글

    9. 친절한 SQL 튜닝  (0) 2023.10.21
    8. 친절한 SQL 튜닝  (0) 2023.10.21
    6. 친절한 SQL 튜닝  (0) 2023.10.20
    5. 친절한 SQL 튜닝  (0) 2023.10.20
    4. 친절한 SQL 튜닝  (0) 2023.10.20