2021. 11. 10. 14:55ㆍ언어/Python
Query performance 측정하기
Django에서 QuerySetAPI를 사용해서 Database의 데이터를 가져올 때, 정확히 어떤 query가 수행되고 어떤 식으로 몇 번 query가 실행되는지 알 수 없다.
이번에 select_related
와 prefetch_related
함수를 공부하면서 두 함수를 사용했을 때와 하지 않았을 때의 성능 차이를 확인하고 싶었는데, connection 객체를 사용해서 성능조회 데코레이터를 구현할 수 있다는 얘기를 듣고 데코레이터를 만들게 되었다.
현재 진행하고 있는 프로젝트에서 전체 상품 리스트를 조회할 때 @count_queries 데코레이터를 사용해서 쿼리 수를 출력한 결과는 다음과 같다.
select_related
와prefetch_related
함수 사용 전실행되는 쿼리 수 : 72
함수 사용 후
실행되는 쿼리 수 : 27
@count_queries decorator를 만들어보자
Django.db의 connection, reset_queries 사용
from django.db import connection, reset_queries
settings.DEBUG 값을 True로 설정한다.
settings.DEBUG = True
connection.queries 함수의 len()을 구해서 실행한 쿼리 수 반환
len(connection.queries)
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을 사용해도 성능측정에 신경을 써야겠다고 생각했다. 이번 데코레이터는 다른 개발환경에서 작업하더라도 사용할 수 있도록 해야겠다. 🤩️
'언어 > Python' 카테고리의 다른 글
TIL51 | Django ORM 최적화(Lazy Loading, Caching, N+1 Problems) (0) | 2021.11.18 |
---|---|
TIL47 | Django Exceptions (0) | 2021.11.10 |
TIL45 | QuerySetAPI - select_related & prefetch_related (0) | 2021.11.10 |
TIL42 | Python에서 CSV파일 다루기(db_uploader.py) (0) | 2021.11.05 |
TIL41 | CodeKata 복소수 계산, 리스트 뒤집기 (0) | 2021.11.02 |