ORM
ORM이란 Object Relation Mapper의 줄임말이다. 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑 해주는 것을 말한다. 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
N+1 문제란?
1개의 쿼리로 데이터를 조회하고 싶지만 N+1개의 쿼리를 사용하여 조회하는 문제
Django의 ORM은 *Lazy-Loading을 기본값으로 사용하고 있어 자체적으로 이를 최적화하여 최소한의 쿼리만 날린다. 하지만 DB 설계에따라 N번 쿼리를 더 날리는 N+1 문제가 종종 발생한다.
*Lazy-Loading : ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아니라 모든 명령 처리가 끝나고 실제로 데이터를 불러와야 할 시점이 왔을 때 데이터베이스에 쿼리를 실행하는 방식
user = User.objects.all()
tim = user.filter(first_name='tim') # 아직 DB에서 데이터를 가져오지않음
order_tim = tim.order_by('id') # 아직 DB에서 데이터를 가져오지않음
timha = user.get(id=1)
email = timha.email.name # timha에서 참조 되는 것이아니라
# email 를 가져오는 쿼리를 더 보냄
N+1 Problem은 쿼리 1번으로 N건의 데이터를 가져왔는데 원하는 데이터를 얻기 위해 이 N건의 데이터를 데이터 수 만큼 반복해서 2차적으로 쿼리를 수행한다.
해결법
Eager-Loading 방식은 사전에 쓸 데이터를 포함하여 쿼리를 날리기 때문에 비효율적으로 늘어나는 쿼리 요청을 방지할 수 있다.
user = User.objects.all()
email = user.prefetch_related('email') # email 가져오는 쿼리를 사전에 날림
- select_related : foreign-key , one-to-one 처럼 single-valued relationships에서만 사용이 가능하다. SQL의 JOIN을 사용하는 방법이다.
- prefetch_related : foreign-key , one-to-one 뿐만 아니라 many-to-many , many-to-one 등 모든 relationships에서 사용 가능하다. SQL의 WHERE … IN 구문을 사용하는 방법이다
'python > django' 카테고리의 다른 글
[DRF] Authentication 종류와 특징 (0) | 2023.09.06 |
---|