티스토리 뷰

Database/Oracle

[오라클] Hash Join 주의할 점

데브포유 2016. 12. 4. 17:28
반응형

오라클에서 대용량데이터 처리시에 사용되는 Hash Join시 주의할 점 1가지를 소개해 드립니다.

 

두 집합중 작은 데이터를 '=' 조인이 되는 컬럼값으로 Hash Table를 생성한 후에 후행 테이블을 Scan 하면서

 

Join이 이루어 지는데요.  이때 후행 테이블 컬럼 조건에 무거운함수가 있다면 속도가 기하 급수적으로 느려집니다.

 

이유는 후행 테이블  Full Scan시에 먼저 상수값으로 필터링하고 그 다음에 함수가 있으면 함수 결과 값을 받은 후에

 

필터를 처리합니다. 즉 필터를 먼저 수행한 다음에 조인이 이루어 집니다.

 

상수값은 어차피 읽은 값이기 때문에 성능에 영향을 많이 주지는 않지만 함수는 후행테이블 로우수 만큼 수행이 되기

 

때문입니다.

 

그러면 어떻게 해야 할까요?

 

먼저 상수값으로 필터링 한 다음 조인키 값으로 조인한 후에  최종으로 함수를 테우면 성능이 좋아 지겠죠~~

 

제가 사용하는 방법은 2가지가 있습니다.

 

첫 번째. MATERIALIZE With 문을 사용해서 함수를 제외한 조인을 한 후에 메인 SQL에서 함수를 테우면 됩니다.
          WITH V_DATAAS(   SELECT /*+ MATERIALIZE */        
                                            A.PRDT_NM         
                                           ,B.PRICE 
                                    FROM T_A  A      
                                            ,T_B  B  
                                    WHERE T_A.PRDT_CD = T_B.PRDT_CD    
                                        AND T_B.DT BETWEEN '20160101' AND '20161231')
          SELECT PRDT_NM   
                   ,PRICE
          FROM V_DATA
          WHERE GET_SUM(PRICE) >= 10000;


두 번째. 그룹함수등을 사용해서 함수에 사용되는 컬럼을 한번 가공한 후에 그 다음에 함수를 수행하는 방법입니다.        
             이방법은 그룹함수를 사용하는지 아닌지에 따라 여러 케이스가 있음으로 그때 그때 다릅니다.

 

※ 실행계획에서 후행테이블 필터 조건에 함수가 수행되지 않게만 만들면 됩니다.

반응형