티스토리 뷰
728x90
반응형
문제 발단
문제 발생의 시스템은 대형폐기물을 처리하는 시스템이었다.
막 해당 시스템을 오픈을 했을때 데이터가 별로 없어 문제가 없었는데
이용자가 하루에 신청자가 많다보니 데이터 늘어나는 속도가 엄청났다. (하루에 만건 이상 신청 ;;)
그렇다보니 관리자 페이지에서 해당 신청 건들을 확인하기위해 들어갔을 경우 페이지 로딩 속도가 점점 늘어나는 것을 확인... 처음에는 5초 ... 10초... 15초
데이터가 1만건 이상부터 문제가 발생하여 빠른 조치가 필요했다..
문제 되는 부분 점검:
우선 자바코드에 이상 있는지 확인을 해보았다. 그러나 자바 코드단에서는 단순이 데이터를 조회만 해올뿐 다른 코드 처리를 하지 않은것을 확인하였다. 그렇다면 애초에 db에서 조회를 해올때 문제가 있을거라 생각하였다.
해결을 위한 확인 내용:
테이블 인덱스 설정 문제
우선 해당 조회에는 3개의 테이블을 조인을 하고 있었다. 데이터가 많아지면서 혹시 조인 시 속도가 느려지는것이 아닌가 하여 테이블 조인간의 인덱스를 확인해 보았다. 확인해 보니 해당 3개의 테이블마다 이런 경우를 대비하여 인덱스를 걸어 두지 않음을 확인하였다.
인덱스 여부를 확인했던것은 조인시 쿼리를 조회할때 인덱스를 걸지 않을 경우 모든 컬럼들을 확인 거치고 해당 조인 정보를 확인하여 결과를 준다 그렇게 되면 어느정도? 속도 해결에 도움이 된다.
그렇기 때문에 특정 인덱스를 지정해 두면 조인 시 해당 정보만 가지고 데이터를 찾기 때문에 속도 개선에 많은 도움이 된다. 하지만 해당 부분을 추가했음에도 속도가 이전보다는 조금 나아졌지만 이걸로는 부족한 부분이었다.
조회 방식 순서의 문제
-
오라클은 페이징을 처리할때 ROWNUM 처리를 통해 페이징을 한다.
-
밑에 나오는 쿼리가 현재 문제가 되는 쿼리 이다.
-
해당 쿼리를 보면 해당 목록 전체를 먼저 조회를 한다음에 페이징을 통해서 데이터를 가져오게 되어있다,
-
그렇다보니 데이터가 그렇게 많지 않았을때는 조회가 잘 되었지만 점점 데이터가 많아지면 모든 데이터를 조회한 다음에 페이징을 하여 처리하기 때문에
-
속도가 점점 느려졌던 것이었다.
문제 코드)
SELECT * FROM (
SELECT
TBL.*
, CEIL( ROWNUM / 10 ) AS PAGE
FROM (
SELECT
....
FROM
waste_order wo
JOIN (
SELECT
...
FROM waste_info wi
JOIN waste_walist wa ON wi.SNO = wa.WAITEM
) walist ON walist.ORDER_SNO = wo.SNO
GROUP BY ...
ORDER BY SNO DESC
) TBL
)
where PAGE = 1
해결방안
: 목록 조회에 대표되는 테이블을 우선 페이징을 통해 데이터를 가져와서 해당 데이터들을 대상으로 서브 테이블 조인을 하여 필요한 데이터를 가져올 수 있도록 하였다. 이렇게 처리를 하니 데이터가 현재 20만 건이 넘어가는 시점에서도 지연 현상 없이 나오는 것을 확인하였다.
해결 코드)
SELECT * FROM (
SELECT
...
FROM ( SELECT * FROM (
SELECT
TBL.*
, CEIL( ROWNUM / 10 ) AS PAGE
FROM(
SELECT
...
FROM
waste_order wo
ORDER BY SNO DESC
) TBL
)
where PAGE = 1
) TT JOIN (
SELECT
...
FROM waste_info wi
JOIN waste_walist wa ON wi.SNO = wa.WAITEM
) walist ON walist.ORDER_SNO = TT.SNO
GROUP BY ...
ORDER BY SNO DESC
)
소감:
대형 데이터에 관한 감각이 크게 없었습니다. 평상시에는 처리할 일이 없었기에 쿼리를 짤때 크게 문제 없을 거라 생각했었는데 사건이 터지고 나서 보니 사소한 부분에서 데이터 이슈가 발생하는 것에 대해 개발의 신중함에 대하여 돌아보게 되었고 테이블 관계성에 대한 이해도가 부족함을 느낄 수 있었습니다. 그리고 이러한 사소함으로 인하여 모든 사용자들에게 불펴함을 제공한다는것에대해 깊은 반성을하게 되는 시간이었습니다.
728x90
반응형
'이슈 해결' 카테고리의 다른 글
프론트 + 백엔드 간의 axios 통신 파일 처리 이슈 해결 회고.. (1) | 2024.10.08 |
---|
250x250
반응형
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스케줄러
- 캐시
- 컨테이너
- leatcode
- 알고리즘
- docker
- ncp
- dfs
- 정의
- 캘린더
- 이미지
- 리눅스
- dockerfile
- 네이버 클라우드
- 격리수준
- Java
- 개념 이해하기
- MySQL
- Cache
- 도커
- 권한
- spring
- Quartz
- hazelcast
- Lock
- insert
- Linux
- centos7
- mybatis
- LocalDate
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함