카테고리 없음

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>`