안녕하세요,
현재 거래관련 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 컬럼추가를 고려하면 될 것 같습니다.
SELECT SUM(금액)
FROM A
WHERE APP_DT BETWEEN '20240601' AND '20240607'
이렇게만 돌려도 오래걸리는 상황입니다. 추가로 APP_DT가 단일인덱스로만 잡힌것도 아니고
해당 테이블이 초당 몇십~몇백개씩 write 되는 상황이라 인덱스 걸기도 애매한 상황입니다 ㅠ
추가로 일정기간이 넘어가면 FULL SCAN 돌리는데 인덱스 잡힌것보다 풀스캔이 더 빠른상황이구요
파티션도 안되어있고, 데이터 쌓이는 속도라면 Full Scan도 감당 안되지 않을까요?
데이터가 쌓이더라도 일정한 성능은 유지해야 좋다고 생각됩니다.
대충만 봐도 하루에 백만건 이상이 쌓일 수 도 있다는건데, 이정도면 집계테이블을 별도로 만들어 운영해야 되는 것 아닌가 생각되네요.
집계테이블도 있긴한데 실시간데이터라 애매하네요 심지어 날짜부분이 varchar라서 그냥 유니온올로 잘라야겠습니다 ㅠ 감사합니다
1분 이상 걸리던게 3초 이내로 나온다면? 유니온도 괜찮은 방법입니다.
집계테이블이 이미 있다면 이용하면 더욱 성능이 나올 듯 하네요.
오늘날짜는 실시간으로, 어제부터는 집계테이블 이용