프로젝트 회고

Optimizer 中 반정규화에 의한 통계 쿼리 실행 속도 향상

iksadnorth 2023. 11. 29. 00:59

👣 개요

반정규화에 의한 통계 쿼리 실행 속도 향상 확인.
Item 테이블과 연관 관계에 놓여 있는 Review 테이블의 Rating 칼럼을 이용해
Item 당 평균 평점값을 계산하는 통계 쿼리를 반정규화를 통해 성능 향상 여부를 확인.

 

👣 실험 계획

Item 테이블의 Row 갯수는 100만 개 있고
Review 테이블의 Row 갯수는 10만 개 있다.
Review 테이블의 Dummy Data를 만들기 위해 설정한 것들을 보면
item_id는 1~10까지의 값만 임의로 부여되도록 설정하고
rating은 1~5까지의 값을 임의로 부여되도록 설정했다.

따라서, Review 테이블을 item_id 값으로 Group By하게 되면 위와 같은 결과를 얻어낼 수 있다.

의도적으로 평점 평균을 구하기 위해 동원되는 Row 갯수를 늘리기 위해 1~10까지의 Item에만 평점을 부여했다.

성능 평가를 위한 메서드는 readItemAvgRating이라는 함수이며,
해당 메서드는 특정 Item의 Review 데이터들의 평균 평점을 계산하는 통계 쿼리를 사용한다.

2가지 버전으로 평균 평점값을 계산하도록 장치를 마련했는데

1번째 버전은 Review 테이블에서 item_id 칼럼값이 itemId인 모든 
Row의 rating 칼럼의 평균을 구함으로서 평균 평점을 계산했고

2번째 버전은 Item 테이블에 평균 평점 칼럼을 추가로 만들고
미리 평균 평점값을 계산하고 조회할 때,
단순히 DB에 저장된 값을 가져오게 만드는 방식을 택했다.

실험에 사용되는 테스트 코드는 위와 같이
순차적으로 N번 메서드를 호출하고 해당 실행 시간을 확인하는 형태로 진행된다.

 

👣 실험 수행

⚗️ 대조군 - 평균 계산을 조회 당시에 계산 후, 출력

1000번 정도 메서드를 호출했을 때의 결과다.

12934 ms, 즉 12.934초가 걸림을 알 수 있다.

 

⚗️ 실험군 - 평균 계산을 리뷰 생성 당시에 계산 후, 조회 시, DB에서 읽고 출력

물론 현재는 avg_rating 칼럼이 초기화되지 않았기에 다음과 같은 쿼리로 칼럼을 초기화 한다.

1000번 정도 메서드를 호출했을 때의 결과다.

1717 ms, 즉 1.717초가 걸림을 알 수 있다.

 

👣 실험 결과

결과적으로 반정규화에 의한 통계 쿼리 실행 속도 향상은 어마어마한 이점을 가져다 주었고 표로 정리하면 다음과 같다.

  특징 수행 시간 향상 효과
대조군 반정규화 X 12934 ms -
실험군 반정규화 O 1717 ms 86.72% 감소