3.9 KiB
3.9 KiB
id, kind, slug, title, topic, project, status, studio, questionStatus
| id | kind | slug | title | topic | project | status | studio | questionStatus |
|---|---|---|---|---|---|---|---|---|
| e1e0e2a0-c6b6-45bf-be42-f697ba5e2fff | QUESTION | cardinality-estimate-after-analyze | ANALYZE 이후 Cardinality Estimate는 어떻게 달라지는가 | JPA 피드 조회 성능 | Liner N + 1문제 | 게시 전 | https://hyeonworks.com/studio/documents/e1e0e2a0-c6b6-45bf-be42-f697ba5e2fff/edit | OPEN |
ANALYZE 이후 Cardinality Estimate는 어떻게 달라지는가
반복되는 하이라이트 조회의 실행계획에서 추정 행수는 1이고 실제 행수는 500이었다. 대량 데이터를 넣은 직후 통계를 갱신하지 않아 편중을 담지 못했다는 가설을 세웠지만 아직 검증하지 않았다.
관계
- PostgreSQL Query Plan 측정 기준 추정과 실제의 차이를 기록하는 기준이다.
- Fetch 타입이 아니라 조회 방식이 만든 ToOne N+1 이 실행계획이 나온 기록이다.
사실
- 대량 시드 직후 측정한 계획에서 추정 rows는 1, 실제 rows는 500이었다. 500배 차이다.
- 이 계획은 feed_item_id 조건을 인덱스로 처리했고 실행시간은 0.173 ms였다.
- 읽은 블록은 모두 캐시에서 왔다. 디스크 읽기는 0이었다.
- 하이라이트 개수는 순위 기반 편중 분포라 feed_item_id별 자식 수가 크게 다르다. 상한 500, 하한 1이다.
- fetch join 조인 계획에서도 추정 4,202와 실제 1,961의 차이가 있었다.
- 시드 직후 통계 갱신 명령을 실행하지 않았다.
가정
- 통계를 갱신하면 feed_item_id별 분포가 반영되어 추정이 실제에 가까워진다.
- 추정이 달라지면 플래너가 다른 계획을 고를 수 있다.
- 편중이 큰 컬럼은 기본 통계 대상 수로 부족할 수 있다.
미지수
- 통계를 갱신한 뒤 추정 행수가 실제에 얼마나 가까워지는가.
- 추정이 바뀌면 스캔 방식이 바뀌는가. 인덱스에서 순차 스캔으로, 또는 그 반대로 뒤집히는가.
- 편중이 큰 컬럼에 통계 대상 수를 늘리면 추정이 더 좋아지는가.
- 실행시간과 읽은 블록 수가 달라지는가.
- 이 차이가 지금까지의 결론을 바꾸는가. 왕복 수와 전송 행수에 관한 판단은 통계와 무관하다.
- 운영에서 대량 적재 후 통계 갱신을 절차에 넣을 것인가.
제약
- 통계 갱신 전후를 비교하려면 같은 데이터에서 연속으로 재야 한다. 캐시 상태가 섞이면 비교가 흐려진다.
- 지금까지 기록한 실행계획은 모두 갱신 전 값이다. 갱신 후 값과 섞어 읽지 않도록 표기를 구분해야 한다.
- 실행하기 전에는 수치를 채우지 않는다.
선택지
1. 통계를 갱신하고 전후를 비교한다
같은 데이터에서 갱신 전후 계획을 나란히 기록한다. 추정 행수, 스캔 방식, 읽은 블록, 실행시간을 대조한다.
측정이 한 번 더 필요하지만 가설을 닫을 수 있다.
2. 통계 대상 수까지 조절해 본다
편중이 큰 컬럼의 통계 대상 수를 늘린 뒤 다시 잰다. 기본값으로 부족한지 확인한다.
변수가 하나 더 늘어 비교가 복잡해진다.
3. 갱신 전 값만 두고 넘어간다
왕복 수와 전송 행수에 관한 결론은 통계와 무관하다. 추정 차이를 한계로만 적고 진행한다.
플래너가 다른 계획을 고를 가능성을 확인하지 못한 채 남는다.
다음 검증
-
대량 시드 직후 현재 계획을 다시 기록한다. 갱신 전 값임을 명시한다.
-
통계를 갱신한다.
-
같은 쿼리를 같은 실행 안에서 다시 EXPLAIN한다. 추정 행수, 스캔 방식, 읽은 블록, 실행시간을 기록한다.
-
두 계획을 나란히 두고 무엇이 달라졌는지 적는다.
-
계획이 바뀌었다면 지금까지의 결론 중 영향을 받는 항목이 있는지 확인한다.
-
운영 절차에 대량 적재 후 통계 갱신을 넣을지 판단한다.