Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
Django & DRF) select_related의 중요성
#python
3년 전
806
2

저번에 select_related에 대해 쓴 적이 있습니다.

그 때 예시를 제대로 들지 못해서 이번에 중요한 건 모자이크 처리하고 갖고 와 봤습니다.

select_related는 한마디로 말하면 SQL의 쿼리를 JOIN 해서 실행하는 겁니다.

그렇게 실행해서 캐시 한 데이터를 가지고 굴리느냐, 그렇지 않느냐에 따라 쿼리의 수와 시간이 매우 차이가 나게 됩니다.

undefined

일단 모델부터 보겠습니다.

대충 C모델이라고 치고, 

필드에는 A 필드와 B필드가 있습니다.

둘 모두 ForeignKey입니다.

undefined

위 모델의 오브젝트를 views.py에서 가져옵니다. 임의의 변수명을 짓고, 기본 장고처럼 date로 필터링해서 가지고 오는데 모델에서 정의했던 필드A와 필드B를 select_related, 즉 JOIN을 해서 가지고 옵니다. 그리고 그것을 시리얼라이저를 통해 디시리얼라이저를 하여 Response로 넘깁니다.

결과는?

undefined

이처럼 단 26.72미리초(sec) 동안 3개의 쿼리만을 실행합니다. 그 중 두 개는 거의 기본적으로 실행되는 거라 실상 하나의 쿼리로 끝냈다고 볼 수 있습니다.

그러면 똑같은 views.py지만 select_related만 지웠을 경우엔 어떻게 될까요?

undefined

위랑 비교해서 단지 select_related 줄만 코멘트 처리하고 나머지는 똑같은 코드입니다.

Response로 넘겨주는 건 넣지 않았지만 동일합니다.

undefined

무려 약 22배의 588.39ms의 시간이 걸렸으며 쿼리 수가 148개로 대폭 늘어났고, 그 중 145개의 쿼리가 매우 비슷하다는 판정이 납니다.

이게 이렇게 되는 이유는, 위에서 정의한 외부키(Foreign Key)의 필드A와 필드B에 대하여 각 ID마다 해당하는 A모델과 B모델에 대해 번번히 쿼리를 실행하여 정보를 가져오기 때문입니다.

실제로 이 쿼리를 실행함으로써 갖고오게 되는 데이터가 97개였는데, 이게 만약 1000개, 10000개가 된다면....걸리는 시간의 차이는 그만큼 늘어나겠죠?

끝.

2 comments