Files
document-haness/docs/n+1liner/tech-log-studio/jpa-feed-query-performance/question/question-isolate-round-trip-and-row-volume.md
T

4.1 KiB

id, kind, slug, title, topic, project, status, studio, questionStatus
id kind slug title topic project status studio questionStatus
5159c415-232d-424a-970a-b0db52746767 QUESTION isolate-round-trip-and-row-volume Round Trip과 Row Volume을 독립 측정할 것인가 JPA 피드 조회 성능 Liner N + 1문제 게시 전 https://hyeonworks.com/studio/documents/5159c415-232d-424a-970a-b0db52746767/edit OPEN

Round Trip과 Row Volume을 독립 측정할 것인가

현재 데이터셋은 N을 키우면 반환 부모 수, 자식 총 행수, 엔티티 생성량, DB 왕복이 동시에 늘어난다. 지연이 늘어난 원인을 어느 하나에 돌릴 수 없다. 변수를 하나씩 격리한 데이터셋을 만들지 결정하지 않았다.

관계

  • JPA N+1 정량 진단 기준 왕복과 행수를 다른 축으로 세는 기준이다.
  • Fetch 타입이 아니라 조회 방식이 만든 ToOne N+1 왕복 수와 한 번에 읽는 행 수를 같은 조회에서 확인한 기록이다.

사실

  • 하이라이트 개수는 순위 기반 편중 분포로 생성된다. 상한 500, 하한 1이다.
  • 하이라이트 총량은 N에 정비례하지 않는다. N=10에서 1,285개인데 N=1,000에서 2,917개다.
  • 조회 수는 하이라이트 총량이 아니라 부모 수 N에 정비례한다.
  • N을 키우면 반환 부모 수, 자식 총 행수, 엔티티 생성량, 왕복이 함께 늘어난다.
  • 지연은 단일 스레드에서 7회 반복하고 앞 2회를 버린 뒤 5개 표본의 중앙값과 최댓값으로 기록했다.
  • 격리 데이터셋 세 종류를 계획했지만 아직 실행하지 않았다.

가정

  • 왕복 수와 전송 행수는 지연에 서로 다른 방식으로 기여한다.
  • 부모 수만 바꾸고 자식 수를 고정하면 왕복의 기여를 분리할 수 있다.
  • 부모 수를 고정하고 자식 수만 바꾸면 과조회의 기여를 분리할 수 있다.

미지수

  • 격리 데이터셋을 추가로 유지할 가치가 있는가. 시더와 테스트가 늘어난다.
  • 부모 수만 바꾼 데이터셋에서 지연이 왕복 수에 선형으로 붙는가.
  • 자식 수만 바꾼 데이터셋에서 지연이 전송 행수에 어떻게 붙는가.
  • 두 기여를 분리해도 전략 선택이 달라지는가. 이미 배치와 프로젝션으로 둘 다 줄였다.
  • 편중 분포를 유지한 데이터셋과 격리 데이터셋을 모두 유지할 것인가, 격리 데이터셋으로 대체할 것인가.

제약

  • 현재 지연 값은 단일 스레드·warm cache 상대값이라 절대값 비교에 쓸 수 없다. 격리 데이터셋을 만들어도 이 한계는 그대로다.
  • 실행하기 전에는 수치를 채우지 않는다. 예상값으로 표를 메우지 않는다.
  • 시더가 복잡해지면 기존 측정의 재현성에 영향을 줄 수 있다. 기존 데이터셋은 유지한 채 추가해야 한다.

선택지

1. 세 데이터셋을 모두 만든다

부모 수만 바꾼 것, 자식 수만 바꾼 것, 편중을 유지한 것 세 가지를 유지한다. 각 변수의 기여를 따로 볼 수 있다.

시더와 테스트가 늘어나고 실행 시간도 길어진다.

2. 편중 데이터셋만 유지하고 격리는 하지 않는다

전략 선택이 이미 정해졌다면 원인 분해가 결정을 바꾸지 않는다. 현재 데이터셋으로 회귀만 지킨다.

나중에 지연 원인을 따져야 할 때 다시 만들어야 한다.

3. 필요할 때만 한시적으로 만든다

특정 판단이 필요해지는 시점에 격리 데이터셋을 만들고 측정한 뒤 남기지 않는다.

측정 시점마다 시더를 다시 맞춰야 해서 재현성이 떨어진다.

다음 검증

  1. 부모 수만 바꾼 데이터셋을 만든다. 부모마다 자식을 정확히 1개씩 둔다.

  2. 부모 수를 고정하고 자식 수만 바꾼 데이터셋을 만든다.

  3. 두 데이터셋에서 왕복 수, 전송 행수, 지연을 각각 측정한다.

  4. 지연이 어느 변수에 어떻게 붙는지 확인한다.

  5. 분해 결과가 이미 내린 전략 선택을 바꾸는지 본다. 바꾸지 않는다면 격리 데이터셋을 상시 유지할 필요가 있는지 다시 판단한다.