본문 바로가기
Web/backend

Django - select_related() & prefetch_related()

by yongmin.Lee 2020. 10. 24.

 

select_related와 prefetch_related는 무엇인가

select_related  prefetch_related 는 하나의 QuerySet을 가져올 때, 미리 related objects들까지 다 불러와주는 함수이다. 비록 query를 복잡하게 만들긴 하지만, 그렇게 불러온 data들은 모두 cache에 남아있게 되므로 DB에 다시 접근해야 하는 수고를 덜어줄 수 있다. 이렇게 두 함수 모두 DB에 접근하는 수를 줄여, performance를 향상시켜준다는 측면에서는 공통점이 있지만, 그 방식에는 차이점이 있다.

 

select_related

  • Database에서 JOIN 쿼리를 수행하여 두 테이블의 정보를 가져와서 캐싱
  • select_related 은 SQL의 JOIN을 사용하는 특성상 many-to-many 관계에서 사용하는 경우 result set이 너무 거대해질 수 있는 문제가 존재하므로 foreign-key , one-to-one 와 같은 single-valued relationships에서만 사용이 가능

 

prefetch_related

  • select_related 와 달리 별도의 2개의 쿼리를 수행후에 파이썬에서 조인다.
  • 성능은 select 보다 느리지만,  many-to-many 관계에서 사용하거나, 역참조시 사용

 

결론

many-to-many , many-to-one 과 같은 relationships에서는 어쩔 수 없이 prefetch_related 를 사용하여야겠지만, foreign-key , one-to-one 와 같은 single-valued relationships이 있는 곳에서는 최대한 select_related 를 사용하여 query 수를 줄여주는 것이 효과적이다.

 

 

'Web > backend' 카테고리의 다른 글

SNS 로그인 flow  (0) 2020.10.24
AWS django 배포  (0) 2020.10.24
Node.js - introduction  (0) 2020.10.24
인증(Authentication) & 인가(Authorization)  (0) 2020.10.24
Django polls 앱  (0) 2020.10.24