2020-04-15 select_related, prefetch_related

seo_kk·2020년 4월 21일
0

select_related와 prefetch_related란?

기본적으로 ORM에서는 하나의 모델에서 Foreignkey가 묶인 다른 자료들을 가져와서 사용할 수 있다.
우리는 불필요한 중복 쿼리문을 없애야할 필요가 있다. 그 방법은 무엇일까?
그것은 바로 하나의 모델을 불러올 때 미리 foreignkey로 연결된 자료까지 불러 오는 것이다. 그렇게 된다면 DB에 접근을 한번만 해도 될 것이다.

  • select_related와 prefetch_related는 하나의 Queryset을 가져올 때, 미리 related objets들까지 다 불러와주는 함수이다.
  • 비록 query를 복잡하게 만들지만, 불러온 데이터는 모두 cache에 남아있게 되므로 DB에 다시 접근해야 하는 이슈가 줄어들 수 있다.
  • 2가지는 모두 DB에 접근하는 수를 줄여주어, performance를 줄여주지만 그 방식에는 차이가 있다.

위의 글은 select_related와 prefetch_related의 개념인데, select_related와 prefetch_related는 모두 필요한 데이터를 한번에 가지고 올 수 있도록 도와준다.

하지만 다른점은 select_related는 foreign-key 혹은 one to one 관계에서 사용이 가능하고, 그에 반해 prefetch_related는 many to many 혹은 foreign-key 등 가리지 않고 사용이 가능하다.

또한 해당 내용을 한번에 모두 가지고 오기 위해 호출해야하는 횟수가 다르다!!!

결론적으로 prefetch_related가 많은 쿼리문을 실행해야 되는 반면,(그 이유는 순차적으로 가져오기 때문이다.) select_related는 한번의 쿼리문으로 모든 것을 가지고 온다.

select_related

select_related는 그렇기에 데이터베이스에 접근하는 빈도를 줄여서 자원 낭비를 차단할 수 있고, 비록 쿼리가 복잡해 지지만 불러온 데이터들은 데이터베이스 서버가 종료가 되지 않는 다면 캐쉬에 남게 되어서 매 쿼리마다 데이터베이스에 접근하지 않아도 된다.

one to one, many to many를 사용하여 정참조 할 때 사용된다. 정참조란, Aquary tool을 보았을 때 화살표 방향대로 뻗어 나가는 것을 보고 판단 할 수 있다.

prefetch_related

prefetch_related는 select_related와 같이 데이터를 캐쉬에 저장하고 모든 관계에서 사용이 가능하지만, 1번 이상의 쿼리가 진행되기 때문에 필요가 없다면 prefetch_related를 지양하는 것이 좋다. 리소스 소모를 줄일 수 있기 때문이다.

쿼리문이 길어지더라도 many to many 관계를 대상으로 참조할 때 데이터를 참조 대상까지 캐쉬에 저장하기 떄문에 Prefetch_related를 사용하는 것이 좋다. 또한 Prefetch_related로 역참조 시에 lookup에 _set을 사용해야 한다.

profile
BackEnd-Developer

0개의 댓글