Git :)

ABOUT ME

-

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

    인덱스를 이용한 소트 연산 생략

    TOP N 쿼리

    TOP N 쿼리는 아래와 같이 간단하게 구현할 수 있다.

    SELECT TOP10 
           거래일자
          ,체결건수
          ,체결수량
          ,거래대금
      FROM 거래
      
      WHERE 종목코드 > 'KR123456'
        AND 거래일시 >= '20180304'
      
      ORDER BY 거래일시
     
     SELECT * 
       FROM (
             SELECT TOP10 
                    거래일자
                   ,체결건수
                   ,체결수량
                   ,거래대금
               FROM 거래
               WHERE 종목코드 > 'KR123456'
                 AND 거래일시 >= '20180304'
               ORDER BY 거래일시
            )
       WHERE ROWNUM <= 10

    DBMS의 옵티마지어는 레코드가 아무리 많아도 그 중 ROWNUM으로 지정한 건수만큼 결과 레코드를 얻으면 거기서 바로 멈춘다. 지금부터 이 기능을 'Top N Stopkey' 알고리즘이라고 부르자.

     

    페이징 처리

    3-Tier 환경에서는 대량 데이터를 조회할 경우 페이징 처리 기법을 활용한다. 일반적으로 사용하는 표준은 아래와 같다.

    SELECT *
      FROM (
            SELECT ROWNUM NO
                 , A.*
              FROM
              (
               /* SQL BODY */
                  
              ) AS A
      		  WHERE ROWNUM <= (:PAGE * 10)
           )
      WHERE NO >= (:PAGE-1)*10 + 1

    3-Tier 환경에서 부분범위를 처리하기 위한 방법은 아래와 같다.

    • 부분범위 처리 가능하도록 SQL을 작성한다. 부분범위 처리가 잘 작동하는지 토드, 오렌지와 같은 툴을 사용하여 확인한다.
    • 작성한 SQL 문을 페이징 처리용 표준 패턴 SQL Body 부분에 붙여 넣어준다.
    인덱스를 이용해 최소/최대값 구하기 위한 조건
    • 전체 데이터를 읽지 않고 인덱스를 이용해 최소 또는 최대값을 구하려면, 조건절 컬럼과 MIN/MAX 함수 인자 컬럼이 모두 인덱스에 포함돼 있어야 한다.
    • 테이블 액세스가 발생하지 않아야 한다. 이렇게 인덱스를 이용해 최소값, 최대값을 가져오는 알고리즘을 'First Row StopKey' 알고리즘 이라고 부른다.
    INDEX_DESC 힌트 활용
    • 단순하게 쿼리의 성능을 높이기 위해 SQL 튜닝 전문가들이 전통적으로 사용해온 방식이 있다.
    SELECT  /*+ INDEX_DESC(X 상태변경이력) */
            거래일자
           ,체결건수
           ,체결수량
           ,거래대금
     WHERE 종목코드 > 'KR123456'
       AND 거래일시 >= '20180304'
       AND ROWNUM <= 1
    • 이 방식은 확실히 성능이 좋은데 문제는 인덱스 구성이 완벽해야만 잘 작동하며 인덱스 구성이 바뀌면 잘못된 값을 가져올 가능성이 있는 단점이 있다.

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

    12. 친절한 SQL 튜닝  (0) 2023.10.21
    11. 친절한 SQL 튜닝  (0) 2023.10.21
    10. 친절한 SQL 튜닝  (0) 2023.10.21
    9. 친절한 SQL 튜닝  (0) 2023.10.21
    8. 친절한 SQL 튜닝  (0) 2023.10.21