TIL 35. What is 'N+1' problem?

Drageon Lee·2022년 1월 17일
0

TIL_Django

목록 보기
8/8

Today's topic

Django를 사용하며 Django의 특징 중 하나가 N+1 issue가 있다는 것을 많이 들어왔다. 얼핏 내용은 알았지만 이 내용에 대해 어떤 문제인지 알아보기 위해서 이번 posting에서는 N+1 problem을 다뤄보고자 한다.

👉 What is "N+1"?

N+1이란 N개의 data를 얻기 위해서 DB에 접근 할 때 1번의 요청이 1번에 DB를 불러오는 것이 아닌 1+N의 query를 실행하는 것을 지칭한다.

👉 What cause "N+1" problem?

우리는 이 N+1 problem을 Django ORM을 사용하면서 접한다.
Django ORM은 Lazy loading 방식이다. Lazy-Loading 방식을 사용하면 ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아니라 실제로 데이터를 불러와야 할 시점에 데이터베이스에 쿼리를 실행하는 방식이다.
그러기에 양이 얼마되지 않는 data를 불러올 때는 큰 상관이 없겠으나, 불러오는 data의 양이 많아지면 많아 질수록 query 또한 많이 불러와야 하기에 성능이 아주 떨어지게 된다.

예시)
update 예정

👉 How to solve "N+1" problem?

Django에서는 위에서 언급한 것 처럼 Lazy-loading 방식을 사용하기에 ORM에서 요청 따로 data 불러올 때 따로 쿼리를 실행한다. 이것을 방지하기 위해서는 Eager-loading 방식을 사용한다.

Django ORM에서 사용하는 Eager-loading 방식으로는 prefetch related와 selected related method가 있다.
Eager-loading 방식은 사전에 쓸 데이터를 포함하여 query를 날리기 때문에 비효율적인 query 요청을 방지할 수 있다.

예시)
update 예정

My opinion

이번 posting에서 N+1에 대해서 알아보았다. ORM을 사용하면서 허점이랄까...???를 느낀 것 같다. 편하긴 하지만 허점도 있으니 빨리 SQL문을 정교하게 익혀야겠다.

profile
운동하는 개발자

0개의 댓글