[빙터뷰] Question create 쿼리 성능 최적화 시도

impala·2023년 7월 12일
0
post-thumbnail
@PostMapping("")
public Long create(@RequestBody QuestionCreateDTO questionCreateDTO) {

	long startTime = System.currentTimeMillis();
    Long id = questionService.create(questionCreateDTO);
    long endTime = System.currentTimeMillis();

    log.info("executionTime={} millis", (endTime - startTime));

    return id;// 질문 id 반환
}
  • 시간측정 코드
questionCreateDTO.getTags().stream()
        .forEach(tagId -> {
            long beforeSelect = System.currentTimeMillis();
            Tag tag = tagRepository.findById(tagId).orElseThrow(() -> new NoSuchElementException("태그 없음"));
            long beforeSave = System.currentTimeMillis();
            tagQuestionRepository.save(
                    TagQuestion.builder()
                            .question(question)
                            .tag(tag)
                            .build());
            long afterSave = System.currentTimeMillis();
            log.info("select={}", (beforeSave - beforeSelect));
            log.info("save={}", (afterSave - beforeSave));

        });
  • 기존 코드 : 태그마다 select -> insert, 총 쿼리 6번
long beforeSelectIn = System.currentTimeMillis();
List<Tag> tags = tagRepository.findAllByIdIn(questionCreateDTO.getTags());
long beforeMapping = System.currentTimeMillis();

List<TagQuestion> tagQuestions = tags.stream()
        .map(tag -> TagQuestion.builder()
                .question(question)
                .tag(tag)
                .build())
        .toList();
long beforeInsert = System.currentTimeMillis();
tagQuestionRepository.saveAll(tagQuestions);
long afterAll = System.currentTimeMillis();

log.info("select in 쿼리={}", (beforeMapping - beforeSelectIn));
log.info("mapping={}", (beforeInsert - beforeMapping));
log.info("insert 쿼리 3번={}", (afterAll - beforeInsert))
  • 수정 코드 : in쿼리로 한번에 select -> insert 3번, 총 쿼리 4번
  • 키 생성 전략이 identity라 batch insert 불가능

결과

  • 기존 코드
    - 총 30ms대
    • 조회는 거의 0~1ms, 저장이 1~2ms
  • 수정 코드
    - 총 50~80ms대
    • in 쿼리가 병목(3개 찾는데 20~30ms)
    • 저장은 3번 합쳐서 2ms

결론 : 기존 코드 유지

0개의 댓글