안녕하세요,
현재 거래관련 A 테이블에는 최소 8000만개가 넘는 데이터가 쌓여있습니다. ( 따로 파티셔닝이 안된 상태입니다 )
인덱스로는 APP_DT 승인일자 CC_DT 취소일자 가
각각 다중인덱스로 INDEX 1 ( APP_DT , 다른필드 ... ) , INDEX 2 ( CC_DT , 다른필드 ... )
가 잡혀있는데요
index merge 로 1주일만 잡아서 금액 SUM 집계를 구하려면 엄청 오래걸립니다. ( 1분넘어갑니다. )
ex ] select SUM(금액) FROM A WHERE APP_DT BETWEEN '20240601' AND '20240607' OR CC_DT BETWEEN '20240601' AND '20240607
이게 하루치만 조회하는 쿼리를 예전부터 많이 사용하고있어서 하루치는 금방 나오는데요
그래서 1주일동안 결과를
( SELECT SUM(금액) FROM A WHERE APP_DT ='20240601' UNION ALL SELECT SUM(금액) FROM A WHERE CC_DT ='20240601' )
UNION ALL
( SELECT SUM(금액) FROM A WHERE APP_DT ='20240602' UNION ALL SELECT SUM(금액) FROM A WHERE CC_DT ='20240602' )
UNION ALL
...
이런식으로 하루치 SUM 금액 쿼리를 UNION ALL로 여러번 돌리면 부하가 심할까요?
저렇게 반복해서 7일치 조회를하면 3초 내로 나오는 상황입니다.
정확한건 실행계획을 봐야 알겠지만, 만약 저라면 아래와 같이 먼저 검토를 할 듯 합니다.
SELECT SUM(금액) FROM A WHERE APP_DT BETWEEN '20240601' AND '20240607' UNION ALL SELECT SUM(금액) FROM A WHERE CC_DT BETWEEN '20240601' AND '20240607' AND APP_DT NOT BETWEEN '20240601' AND '20240607' -- 위에서 조회된 데이터가 중복으로 조회될 수 있으므로 제외하기 위함
여기서, Union all 아래 조건절은 INDEX2를 타게 될 건데요, 혹시 이부분에서 성능이 안나온다면, 인덱스에 APP_DT 컬럼추가를 고려하면 될 것 같습니다.