Django 6.1의 FETCH_PEERS는 2,001개의 쿼리 루프를 2개로 축소합니다.
Django 6.1은 명시적인 select_related 또는 prefetch_related 호출 없이 N+1 쿼리 문제를 해결하기 위해 fetch_mode를 도입했습니다. fetch_mode 설정, 특히 FETCH_PEERS는 외래 키 조회에 대한 쿼리 수와 실행 시간을 크게 줄여줍니다. 테스트 결과 FETCH_PEERS는 2,001개의 쿼리 루프를 단 2개로 변환하여 약 87배의 성능 향상을 보였습니다. 이러한 성능 향상은 select_related를 사용하는 것과 유사하며 효율적인 배치 페칭을 달성합니다. 그러나 FETCH_PEERS는 관계의 역방향에는 적용되지 않으므로 "다수" 측의 N+1 문제를 해결하려면 prefetch_related가 여전히 필요합니다. FETCH_RAISE 모드는 필드 접근을 차단하여 의도하지 않은 지연 로딩을 방지하도록 설계되었습니다. FETCH_PEERS와 QuerySet.iterator()를 결합할 때 피어 추적 방식 때문에 N+1 패턴으로 되돌아가는 중요한 주의 사항이 있습니다. 또한 FETCH_PEERS는 쿼리셋의 모든 관련 데이터를 미리 배치하며, 일부만 접근하더라도 이는 일부 시나리오에서 select_related보다 덜 효율적일 수 있습니다. 테스트 규모에서는 쿼리셋을 구체화하고 관련 데이터를 가져오는 데 따른 메모리 오버헤드가 작았습니다. FETCH_PEERS를 실행하는 동시 스레드는 독립적으로 2개의 쿼리 수를 유지하여 부하 시에도 견고함을 나타냈습니다. 버퍼 제한을 초과하면 잘못된 결과가 조용히 발생할 수 있으므로 쿼리 수 계산 디버깅 시 버퍼 제한에 주의해야 합니다.