데이터 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
-
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