통계 산출 쿼리 튜닝을 진행하면서,
최종적으로, 이를 위한 대용량 데이터 산출 시 성능 개선을 위해 소계(SUM OVER PARTITION)을 사용해야 했다.
이때 GROUP BY로 1차 기준 데이터를 산출하고, 이를 서브쿼리로 활용하여 기준 데이터의 소계값을 산출해야 했는데 기준데이터의 부호에 따라 합산항목에 넣거나 제외해야 하는 조건절을 구성해야 했다.
SUM OVER PARTITION BY에 의한 소계 시 조건이 필요할 경우 조치하였던 이번 경험을 기록하여 남긴다.
두가지 방안이 있다.
이 경우 CASE WHEN / DECODE를 이용해서 A항목과 B항목에 대해서 조건을 구성해주면 되므로 간단하게 처리할 수 있다.
SUM(A+B) OVER PARTION... 이런 식으로 SUM 내부에 합산항목과 조건을 구성해줄 수 있다.
이 경우, 예를 들어 SELECT SUM_OF_A_B FROM (SELECT SUM(A+B) AS SUM_OF_A_B FROM TABLE GROUP BY..)에서 1차적으로 SUM_OF_A_B 기준 데이터를 산출하였으며
이후에 SELECT SUM_OF_A_B, SUM(DECODE(SIGN(SUM_OF_A_B),-1,0,SUM_OF_A_B)) OVER PARTITION BY(...)).... 이런 식으로, 위의 경우 SUM_OF_A_B가 -일 경우 합산 제외(0), +일 경우 합산하는 방식으로 진행할 수 있다.
서브쿼리를 하면서 성능개선을 기대할 수 있는 상황은,
1) 기준 데이터 테이블(WITH)을 최소화할 수 있는 경우
2) 연산을 하나의 테이블 안에서 모두 진행할 수 있는 경우
이 두가지 경우로, 나의 경우 서브쿼리화 작업을 통해 10초 이상 걸렸던 수행을 0.5~6초로, 99% 이상 개선되었음을 확인하였다.