데이터 20만건 처리에 대해서 - part1 #173
Unanswered
Irisation23
asked this question in
c. Database
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Outline
Spring AOP를 사용하여 위의 이미지와 유사한 구조로 DB 쿼리 성능에 대한 동작 시간 단위 별 테스트를 진행하고자 한다.
Main
먼저 Spring AOP를 사용하기 위해서는 의존성 주입이 필요하다.
Conclusion
1차
2차
콘솔에서 쿼리 부분 체크 시간은 5초 가량 걸리고 리스트 다 불러오고 로딩 끝나는 시간 까지는 약 1분가량 걸림
* 쿼리 부분 콘솔 체크
* 페이지 로딩 완료 시간 체크
쿼리 성능 개선방법
개선 방법 중 인덱스 사용으로 쿼리 성능 테스트를 진행
인덱스 사용한 쿼리 튜닝 시 참고할 점
인덱스 생성 전 쿼리 시간 (LIMIT 30만 기준)
인덱스 생성 후 쿼리 시간
위 그림과 같이 인덱스를 적용한 컬럼들을 조건 걸어서 약 21만개 가량의 데이터를 조회했으나 인덱스 적용 전과 큰 차이가 없었다. 다른 방법을 조사해야할 것으로 보임.
3차
쿼리 성능 개선에 대한 다양한 방법들 조사 후 적용해본 결과
이전에 WHERE 조건에 들어가는 컬럼들을 인덱스 지정하고 테스트했고 이번에 JOIN에 들어가는 컬럼들을 인덱스 지정하여 테스트 했으나 4~5초가량 걸리는 걸 확인했고 이전에 비해 개선되지 않았다.
EXPLAIN 으로 확인해보았을 때 테스트하는 쿼리에는 인덱스가 정상적으로 동작하고 있었다.
반복적으로 실행되는 쿼리를 캐시하여 데이터베이스 서버의 부하를 줄이고 성능을 향상시킬 수 있는 것.
아래는 쿼리 캐싱 확인
위와 같은 형식으로 실행가능하다. 테스트해보았으나 큰 차이가 없었다.
4차
Sequence, Trigger 사용해서 JOIN 방식 변경
Sequence 생성 + 기존 테이블에 컬럼 추가 및 업데이트
Trigger 생성 + 기존 백 코드 일부 수정
결과 및 문제점
아래의 첫번째 이미지와 같이 DB에서 직접 쿼리 동작 시 시간이 20분 이상 지속되며 쿼리 결과를 불러오지 못하고 'http://localhost:8888/api/receive/list?itemName=신발&acountName=고양이 카페&manager=김' 와 같이 주소 창에서 테스트할 때는 두번째 이미지와 같이 경고가 뜨고 나서 수행이 반복되는 동작이 일어났다.
5차
쿼리 개선의 방향성 재정립
index 사용하여 재확인
index 없는 경우
http://localhost:8888/api/receive/list?itemName=신발
index 있는 경우
http://localhost:8888/api/receive/list?itemName=신발
테스트 결과
IOException : Broken pipe 원인 및 해결방법
원인
해결방법
결과
방법 1 : 클라이언트에 '요청량 초과'를 담아서 보내줌
따라서 메서드 시간에 8초 시간 제한을 걸고 넘을 경우 아래와 같이 전송하도록 구현함.
방법 2 : 초과 발생할 경우 상위 일부만 보내줌
응답 데이터를 아무것도 없이 메시지만 띄우도록 하는 것은 클라이언트에서 조회에 따른 일반적인 응답이 아닐 수 있음
따라서 상위의 일부 데이터만 띄워서 보내주는 것으로 수정
TimeOutAspect
방법 3 : 페이징 처리
따라서 클라이언트에 요청 받고 리스트에 대한 페이징 처리를 하는 방식으로 진행한다.
해당 내용은 [DB] - DBMS의 실행 계획 - Fin #75 로 이어짐.
추가 확인 및 개선할 부분
AOP 적용 시 결과가{
"success": true,
"data": null,
"error": null
}
이렇게 반환되는 상황인데 aop 적용과 리스트 결과 반환이 서로 잘되도록 수정 필요
-> 메서드 타입 Object로 변경. 'joinPoint.proceed()' 호출한 후 원래의 메서드를 실행하고 반환값을 'returnValue' 변수에 저장하도록 함.
이 후 해당 값을 리턴하도록 수정하여 해결.
데이터가 그렇게 많지 않아 쿼리 시간 체크가 애매해서 데이터 추가 및 쿼리 수정 등을 통한 추가 테스트가 필요해보임-> shell script 사용해서 입고 테이블 기준 20만개 가량 추가하고 테스트 진행 중
쿼리 동작 시간 개선 방법 조사확인 기준 55만개까지는 괜찮았으나 56만개 부터는 'java.io.IOException: Broken pipe' 이 발생하여 처리 방법에 대한 조사도 필요해보임인덱스 사용했으나 크게 변화가 없어서 다른 방법 조사References
Beta Was this translation helpful? Give feedback.
All reactions