Select_Related & Prefetch_Related

Min-Ho Lee·2020년 11월 22일
1

Learn Django

목록 보기
13/13

Sun_Nov_22
.
.
.
select_related와 prefetch_related의 차이점에 대해서 알아보려고 한다.

이전의 2개의 글에서 QuerySet과 ORM에 대해 글을 썼었다.
QuerySet은 일반적으로 Lazy-Loading(지연 로딩) 방식을 선택을 한다.

하지만 앞서 말했듯, Eager-Loading(즉시 로딩)으로 많은 데이터를 한 번에 가져오고 싶을 때가 있다고 하였고 그것을 지원해 주는 메소드로는
select_related와 prefetch_related가 있다고 말했다.

select_related

먼저 select_related는 SQL을 호출 시, JOIN을 통해 한 번에 데이터를 가져온다. 당연히 그 결과는 QuerySet의 _result_cache라는 곳에 담겨있을 것이다.

그리고 정참조 일 때만 가능하다.

여기서 중요한 건 SQL의 JOIN을 통해 한 번에 많은 데이터를 가져온다는 것이다.

prefetch_related

한 번 더 설명을 하자면, QuerySet은
1개의 Query와 0~N 개의 추가 QuerySet으로 구성되어 있다고 설명했다.

자 그럼, prefetch_related는 역참조 관계일 때 사용이 되며
원래의 Query + prefetch_related로 옵션을 준 테이블의 추가 QuerySet으로 이루어진다.

그래서 QuerySet이 0개에서 N 개의 추가 QuerySet이 있다고 설명한 이유가 prefetch_related 때문인 것이다.

prefetch_related 메소드를 사용하지 않았다면,
QuerySet은 그냥 Query로 이루어져 있을 것이고,(select_related를 써도 어차피 JOIN으로 이루어진 Query.)

prefetch_related 메소드를 사용하여 옵션을 주었다면, 옵션을 준 테이블의 개수만큼 추가 QuerySet이 추가로 구성이 될 것이다.

그리고 앞에서 사진과 링크도 함께 언급을 했는데, 그 옵션을 준 테이블은 클래스 변수인self._prefetch_related_lookups = ()에 있다.
Django QuerySet Class 에서 확인이 가능하다.

결론

select_related는 JOIN을 통해 여러 데이터를 가져온다.
prefetch_related는 옵션을 준 테이블을 다시 Call 하여서 여러 데이터를 가져온다.

QuerySet += Query😁

당연히 설명도 부족할 것이고 아직 나도 많이 부족하지만,
이번에 올라온 PyCon QuerySet ORM 영상을 보고 정말배운 게게 많다.

예전엔 유튜브로 재밌는 영상들만 많이 봤는데
요즘은 개발이 점점 재밌어 가면서학창 시절에는는 몰랐던 '배움'의 즐거움을
개발을 배우고서야 깨달았다.
보면 유튜브로도개발 관련련 영상만보는 것것 같다.

영상을 첨부할 테니 미흡한 설명을 채우고 싶다면
아래 영상을 참고하면 될 것 같다.

profile
🐇 Rabbit can take a rest, but 🐢 turtle can't

0개의 댓글