ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL BOOSTER - HASH JOIN과 성능
    DataBase/SQL 2024. 6. 24. 14:37

     

    1. 대량의 데이터 처리

     

    NL 조인은 많은 양의 데이터를 조인 처리하기에는 적합하지 않다. 그러므로 많은 양의 데이터를 조인하려면 머지 조인을 사용해야한다. 하지만, 머지 조인도 데이터를 정렬해야 하는 부담이 있다.

    이와 같은 단점을 해결할 수 있는 것이 해시 조인이다.

     

    해시 조인은 해시 함수를 사용하기 때문에 CPU와 메모리에 추가적인 부하가 발생한다. 하지만 머지 조인에 비하면 월등한 성능을 가지고 있다. 대용량 데이터 조인은 해시 조인이 필수다. 

     

    SELECT /*+ GATHER_PLAN_STATISTICS LEADING(T1) USE_MERGE(T2) */
    T1.CUS_ID, MAX(T1.CUS_NM) CUS_NM, MAX(T1.CUS_GD) CUS_GD, COUNT(*) ORD_CNT, SUM(T2.ORD_AMT) ORD_AMT,
    SUM(SUM(T2.ORD_AMT)) OVER() TTL_ORD_AMT
    FROM M_CUS T1, T_ORD_BIG T2
    WHERE T1.CUS_ID = T2.CUS_ID
    GROUP BY T1.CUS_ID;

     

    SQL BOOSTER

     

    이제 힌트만 HASH로 바꿔보자 

     

    SELECT/*+ GATHER_PLAN_STATISTICS LEADING(T2) USE_HASH(T1) */
    T1.CUS_ID, MAX(T1.CUS_NM) CUS_NM, MAX(T1.CUS_GD) CUS_GD
    ,COUNT(*) ORD_CNT, SUM(T2.ORD_AMT) ORD_AMT, SUM(SUM(T2.ORD_AMT) OVER() TTL_ORD_AMT
    FROM M_CUS T1, T_ORD_BIF T2
    WHERE T1.CUS_ID = T2.CUS_ID
    GROUP BY T1.CUS_ID;

    SQL BOOSTER

     

    어느 쪽을 빌드 입력을 선택하든 성능에 큰 차이가 나지 않을 수 있다. 하지만 습관적으로 조금이라도 작은 쪽을 선행 집합으로 해서 조인 처리하는 것이 좋다.

     


    2. 대량의 데이터에만 사용할 것인가?

     

    해시 조인은 대량의 데이터를 조인할 때 유용한 방법이라고 설명했다.

     

    하지만 해시 조인은 대량의 데이터 뿐 아니라, 소량의 데이터를 조인할 때도 매우 유용하다.

     

    실행계획을 확인하다 보면, 해시 조인이 발생하는 SQL을 자주 보게 된다. 

    여러 테이블의 조인 절에서 사용한 SQL도 해시 조인이 발생했다.

     

    SELECT /*+ GATHER_PLAN_STATISTICS */ 
    T1.ITM_ID, T1.ITM_NM, T2.ORD_ST, COUNT(*) ORD_QTY
    FROM M_ITM T1, T_ORD_JOIN T2, M_CUS T3
    WHERE T1.ITM_ID = T2.ITM_ID
    AND T3.CUS_ID = T2.CUS_ID
    AND T1.ITM_TP = 'ELEC'
    AND T3.CUS_GD = 'B'
    AND T2.ORD_YMD LIKE '201702%'
    GROUP BY T1.ITM_ID, T1.ITM_NM, T2.ORD_ST;

     

    SQL BOOSTER

     

    실행 계획에서 M_ITM과 T_ORD_JOIN의 NL 조인의 결과는 26,000건이다. 26,000데이터가 M_CUS와 조인할 때는 해시 조인으로 처리되고 있다. 26,000건 정도면 NL조인으로도 충분히 처리할 수 있다. 

    SQL BOOSTER

     

    NL조인으로 변경시 Bufferes가 26,362에 달하고 있다.

    해시 조인은 메모리와 CPU를 비교적 많이 사용하다는 점과 대용량 데이터 조인이 적합하다는 이유로 소량의 데이터는 무조건 NL 조인만 사용해야한다고 생각할 수 있다. 

    하지만 모든 SQL을 NL조인으로 변경할 필요는 없다. (효과가 매우 작을 수도 있다)

     

    *만약 특정 SQL이 매우 많이 사용되면서 CPU 점유 시간이 높다면 해시 조인을 제거할 방법을 고민해 봐야 할 것이다. 

    이런 상황이 아니라면 굳이 해시 조인을 제거하려고 노력할 필요는 없다.

     


    3. 어떤 조인을 사용할 것인가?

     

    SQL의 목적과 사용 빈도 그리고 DBMS 성능에 따라 다양하게 결정할 수 있다.

    OLTP 환경의 로그인 처리, 계좌이체, 주문처리 같은 자주 실행되는 SQL은 NL 조인만으로 처리하는 것이 

    데이터베이스 전체 성능에 도움이 된다. 

     

    단, NL 조인의 성능이 확보되도록 적절한 인덱스가 구성되어 있어야 한다.

    대량의 데이터를 조회해서 분석을 수행한다면 해시조인이 유용하다.

    머지 조인이 활용되는 경우는 많지는 않다. 

     

    조인 조건 컬럼에 적절한 인덱스를 만들기 어려울 때도 해시 조인을 활용 한다.

     

    힌트를 사용하지 않는 한 어떤 조인을 할지는 옵티마이저가 결정한다. 옵티마이저가 제일 나은 선택을 할 수 있게 인덱스를 잘 구성해주는 것이 중요하다.

     

    인덱스를 잘 구성하려면, SQL이 어떤 조인 방식으로 처리하는 것이 좋은지 먼저 판단할 수 있어야 한다.

    조인에 따라 효율적인 인덱스가 다르기 때문이다. 그렇기 때문에 옵티마이저보다 앞서서 어떤 조인 방식이 좋은지 예측할 수 있어야 한다.

     


    참고자료 

    https://www.yes24.com/Product/Goods/82818767

     

    SQL BOOSTER - 예스24

    SQL BOOSTER는 프로젝트 성공을 위한 SQL 필독서다. 이 책은 마치 프로젝트를 진행하는 순서처럼 구성되어 있다. 프로젝트 투입을 위해 필요한 SQL 기술을 설명하고, 성능 테스트를 위해 필요한 기술

    www.yes24.com

     

    'DataBase > SQL' 카테고리의 다른 글

    SQL BOOSTER - 분석함수  (0) 2024.07.10
    SQL BOOSTER - MERGE 조인과 성능  (0) 2024.06.24
    SQL BOOSTER - MERGE  (0) 2024.06.23
    SQL BOOSTER - 서브쿼리 (WHERE)  (0) 2024.06.23
    SQL BOOSTER - 서브쿼리 (SELECT)  (0) 2024.06.23
Designed by Tistory.