본문 바로가기
기타

TIL - 22.02.24

by DGK 2022. 2. 24.

 

개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

2월 24일(목)

 

Select_related & Prefetch_related


Select_related와 Prefetch_related란?

 

Select_related와 Prefetch_related는 하나의 쿼리셋을 가져올 때 연관이 되어있는 objects들을 미리 불러오게(Eager Loading) 하는 함수이다. JOIN문을 사용하기 때문에 호출되는 SQL문이 복잡해질 수 있지만, 이렇게 불러온 데이터들은 result_cache(SQL문의 수행 결과가 저장되는 부분, 만약 저장된 데이터가 없으면 새로운 SQL문 호출) 부분에 cache 되기 때문에 결과적으로 중복 호출을 방지할 수 있다.

 

이렇게 Select_related와 Prefetch_related 두 함수 모두 DB에 액세스하는 횟수를 줄여주므로 Performance를 향상시킬 수 있다. (단, 두 함수의 SQL문이 호출되는 방식에는 차이가 존재함)

 

 

Select_related()

 

  1. Select_related() 함수는 JOIN문을 통해 DB로부터 데이터를 즉시 가져오는 방법(Eager Loading)을 사용한다. [SQL 단계에서의 JOIN]
  2. Select_related() 함수는 1:1의 관계에서 사용할 수 있고, 1:N의 관계에서도 N이 사용할 수 있다.
  3. 또한, Select_related() 함수는 정방향 참조에서의 JOIN문에 유리하게 사용된다.
  4. Select_related() 함수를 사용하면 사용하지 않는 경우보다 SQL문의 호출 횟수를 줄일 수 있으며, 특정 관계의 데이터를 미리 가져올 수 있다. (result_cache에 저장하는 Eager Loading 방식으로 Performance 향상) 

 

 

Prefetch_related

 

  1. Prefetch_related() 함수는 추가 쿼리를 통해 데이터를 즉시 가져오는 방법을 사용한다. [추가 쿼리발생]
  2. Prefetch_related() 함수는 1:N의 관계에서 1이 사용할 수 있고, M:N의 관계에서 사용할 수 있다.
  3. Select_related() 함수와의 가장 큰 차이점은 추가 쿼리가 발생한다는 것이고, 이렇게 발생한 추가 쿼리는 파이썬 단계에서 JOIN문을 통해 실행된다는 것이다.
  4. 참고로, Prefetch_related() 함수의 두 번째 인자에 queryset을 재정의하면 추가 쿼리셋을 제어할 수도 있다. (추가 쿼리발생X)

 

 

정리하자면, Select_related() 함수와 Prefetch_related() 함수는 관계있는 objects를 Eager Loading 하기 위해 사용된다. 다만 1:1, 1:N, N:M 관계 중에 따라 다르게 사용하는 것과 추가적인 쿼리가 생성되는지에 대한 차이가 있을 뿐이다. 퍼포먼스 측면에서 이야기 하자면 한 번에 많은 데이터를 미리 가져오는 것이 유리할 수도 있고, 작은 양의 데이터를 여러 번 가져오는 것이 유리할 수도 있다. 따라서 여러 상황을 절적히 판단하여 위의 두 함수을 사용해야 한다.

 

 

'기타' 카테고리의 다른 글

TIL - 22.02.23  (0) 2022.02.23
TIL - 22.02.22  (0) 2022.02.22
TIL - 22.02.21  (0) 2022.02.21
TIL - 22.02.18  (0) 2022.02.18
TIL - 22.02.17  (0) 2022.02.17

댓글