TIL46 | Query Performance Counter Decorator

2021. 11. 10. 14:55언어/Python

반응형

Query performance 측정하기

Django에서 QuerySetAPI를 사용해서 Database의 데이터를 가져올 때, 정확히 어떤 query가 수행되고 어떤 식으로 몇 번 query가 실행되는지 알 수 없다.

이번에 select_relatedprefetch_related 함수를 공부하면서 두 함수를 사용했을 때와 하지 않았을 때의 성능 차이를 확인하고 싶었는데, connection 객체를 사용해서 성능조회 데코레이터를 구현할 수 있다는 얘기를 듣고 데코레이터를 만들게 되었다.

 

현재 진행하고 있는 프로젝트에서 전체 상품 리스트를 조회할 때 @count_queries 데코레이터를 사용해서 쿼리 수를 출력한 결과는 다음과 같다.

  • select_relatedprefetch_related 함수 사용 전

    실행되는 쿼리 수 : 72

  • 함수 사용 후

    실행되는 쿼리 수 : 27

 

@count_queries decorator를 만들어보자

  1. Django.db의 connection, reset_queries 사용

    from django.db import connection, reset_queries

  2. settings.DEBUG 값을 True로 설정한다.

    settings.DEBUG = True

  3. connection.queries 함수의 len()을 구해서 실행한 쿼리 수 반환

    len(connection.queries)

  4. reset_queries() 함수 실행으로 queries_log 초기화

    reset_queries()

 

source code

from django.conf    import settings
from django.db      import connection, reset_queries

def count_queries(func):
    def wrapper(self, request):
        try:
            settings.DEBUG = True   
            func(self, request)
            print(f'query performance count : {len(connection.queries)}')

        finally:
            settings.DEBUG = False
            reset_queries()
        return func(self, request)
    return wrapper

 

마치며...

닷넷 & MS-SQL로 개발할 때는 DBMS를 사용해서 직접 실행되는 쿼리문을 작성하거나 DBMS에서 제공하는 쿼리 성능측정 기능을 사용했었는데, ORM을 쓰면서는 쿼리 성능에 대해서는 고려하지 못했던 것 같다.

이번에 query counter 데코레이터를 만들면서 ORM을 사용해도 성능측정에 신경을 써야겠다고 생각했다. 이번 데코레이터는 다른 개발환경에서 작업하더라도 사용할 수 있도록 해야겠다. 🤩️

반응형