카테고리 없음
nplusone : Python framework 에서 N+1 문제를 찾기 쉽게 도와주는 라이브러리 추천
cocojen
2025. 3. 6. 13:46
요즘 조금 여유가 생겨서 프로젝트 내에 잘못된 orm 사용으로 생기는 비효율적인 쿼리를 개선하고 있는데, 쉽게 찾을 수 있는 방법이 없을까 검색하다가 nplusone 이라는 파이썬 라이브러리를 사용해보았는데 내 시간을 매우 아껴주었다. 혹시 비슷한 사람이 있을까봐 정리해본다.
라이브러리 설명
링크 : https://pypi.org/project/nplusone/
nplusone은 Python ORM 프레임워크에서 발생하는 N+1 쿼리 문제를 감지하고 진단하기 위한 라이브러리이다. N+1 쿼리 문제는 ORM을 사용할 때 흔히 발생하는 성능 이슈로, 하나의 객체 목록을 가져온 후(1회 쿼리) 각 객체의 관련 데이터를 개별적으로 추가 쿼리(N회 쿼리)하는 상황을 말한다.
<주요 특징>
- Django ORM과 SQLAlchemy를 지원
- 애플리케이션에서 발생하는 N+1 쿼리를 감지
- 불필요한 즉시 로딩(eager loading)도 감지 (관계 데이터를 미리 로드했지만 사용하지 않는 경우)
설치 & 설정
pipenv install nplusone
INSTALLED_APPS = (
...
'nplusone.ext.django',
)
MIDDLEWARE = ("nplusone.ext.django.NPlusOneMiddleware",
"...
)"
NPLUSONE_LOGGER = logging.getLogger('nplusone')
NPLUSONE_LOG_LEVEL = logging.WARN
LOGGING = {
"version":1,
"handlers":{
"console":{
"class":"logging.StreamHandler"
}
},
"loggers":{
"nplusone":{
"handlers":[
"console"
],
"level":"WARN"
}
}
}
사용방식
- 애플리케이션이 실행되고 실제 데이터베이스 쿼리가 발생할 때 detect 할 수 있음.
- 아래와 같이 console 에 log 가 찍혀서 알 수 있다. 이거랑 django debug toolbar 랑 같이 쓰면 장고에서 sql 볼 때 매우 편리한 것 같다.
Potential n+1 query detected on `<model>.<field>`
Potential unnecessary eager load detected on `<model>.<field>`