UNION ALL 부하 질문드립니다. 0 5 4,331

by 초보개발자001a [MySQL] [2024.07.05 08:47:28]


안녕하세요,

현재 거래관련 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초 내로 나오는 상황입니다.

by 모래가흙흙 [2024.07.06 00:44:07]

정확한건 실행계획을 봐야 알겠지만, 만약 저라면 아래와 같이 먼저 검토를 할 듯 합니다.

 

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 컬럼추가를 고려하면 될 것 같습니다.

 


by 초보개발자001a [2024.07.06 22:47:00]

SELECT SUM(금액)

  FROM A

 WHERE APP_DT BETWEEN '20240601' AND '20240607'

이렇게만 돌려도 오래걸리는 상황입니다. 추가로 APP_DT가 단일인덱스로만 잡힌것도 아니고

해당 테이블이 초당 몇십~몇백개씩 write 되는 상황이라 인덱스 걸기도 애매한 상황입니다 ㅠ

추가로 일정기간이 넘어가면 FULL SCAN 돌리는데 인덱스 잡힌것보다 풀스캔이 더 빠른상황이구요


by 모래가흙흙 [2024.07.09 00:24:09]

파티션도 안되어있고,  데이터 쌓이는 속도라면  Full Scan도 감당 안되지 않을까요?

데이터가 쌓이더라도 일정한 성능은 유지해야 좋다고 생각됩니다.

대충만 봐도 하루에 백만건 이상이 쌓일 수 도 있다는건데,  이정도면  집계테이블을 별도로 만들어 운영해야 되는 것 아닌가 생각되네요.  


by 초보개발자001a [2024.07.09 10:47:22]

집계테이블도 있긴한데 실시간데이터라 애매하네요 심지어 날짜부분이 varchar라서 그냥 유니온올로 잘라야겠습니다 ㅠ 감사합니다


by 마농 [2024.07.09 11:22:28]

1분 이상 걸리던게 3초 이내로 나온다면? 유니온도 괜찮은 방법입니다.
집계테이블이 이미 있다면 이용하면 더욱 성능이 나올 듯 하네요.
오늘날짜는 실시간으로, 어제부터는 집계테이블 이용

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입