[python] SQLAlchemy의 성능 모니터링 방법

SQLAlchemy는 파이썬으로 작성된 강력한 ORM(Object-Relational Mapping) 라이브러리입니다. 하지만 ORM을 사용하면 성능 문제가 발생할 수 있습니다. 이러한 문제를 식별하고 최적화하기 위해 SQLAlchemy의 성능을 모니터링하는 방법을 알아보겠습니다.

1. 쿼리 로그 활성화

SQLAlchemy는 쿼리 실행 로그를 기록하는 기능을 제공합니다. 따라서 쿼리를 실행할 때마다 해당 로그를 확인하여 성능 문제를 파악할 수 있습니다.

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

위의 코드를 사용하여 SQLAlchemy의 로깅 레벨을 INFO로 설정하면 쿼리 실행 로그가 출력됩니다. 쿼리 로그에는 실행된 쿼리, 실행 시간, 바인딩된 매개변수 등의 정보가 포함됩니다.

2. SQL 쿼리 프로파일링

SQLAlchemy는 ProfiledSession을 통해 쿼리 실행 시간을 측정할 수 있는 프로파일링 기능을 제공합니다.

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext import baked

engine = create_engine('sqlite:///my_database.db')
session = sessionmaker(bind=engine)
ProfilingSession = sessionmaker(bind=engine, class_=baked.bakery(lambda session: baked.SessionEvents(session)))
profiling_session = ProfilingSession()

# 프로파일링 시작
profiling_session.begin_profiling()

# 쿼리 실행
results = profiling_session.query(MyModel).all()

# 프로파일링 종료
profiling_session.end_profiling()

# 실행 시간 보기
for query, duration in profiling_session.get_query_profiles():
    print(f"쿼리: {query}")
    print(f"수행 시간: {duration}\n")

위의 코드에서는 ProfiledSession을 생성하여 프로파일링을 시작하고 쿼리를 실행한 후 프로파일링을 종료합니다. get_query_profiles 메서드를 사용하여 실행된 모든 쿼리와 해당 실행 시간을 확인할 수 있습니다.

3. SQLAlchemy-Continuum 사용

SQLAlchemy-Continuum은 SQLAlchemy의 확장 라이브러리로 데이터베이스 변경 이력을 추적하는 기능을 제공합니다. 성능 모니터링을 위해 쿼리 실행 전후의 데이터베이스 상태와 변경된 로우를 비교할 수 있으므로 성능 문제를 식별하고 최적화하는 데 도움이 됩니다.

from sqlalchemy_continuum import make_versioned
from sqlalchemy_continuum.plugins import FlaskPlugin

make_versioned(plugins=[FlaskPlugin()])

# 쿼리 실행 전
previous_state = MyModel.query.filter(...).all()

# 쿼리 실행
results = MyModel.query.filter(...).all()

# 쿼리 실행 후
current_state = MyModel.query.filter(...).all()

# 이전 상태와 현재 상태 비교
for row in current_state:
    if row not in previous_state:
        print(f"변경된 로우: {row}")

위의 코드에서는 SQLAlchemy-Continuum의 make_versioned 함수를 사용하여 버전 관리를 활성화합니다. 쿼리를 실행하기 전과 후에 데이터베이스 상태를 비교하여 변경된 로우를 확인할 수 있습니다.

결론

SQLAlchemy의 성능을 모니터링하는 것은 애플리케이션의 성능 최적화에 중요한 요소입니다. 쿼리 로그를 활성화하고 프로파일링 기능을 사용하면 성능 문제를 파악하고 최적화할 수 있습니다. 또한 SQLAlchemy-Continuum을 활용하여 데이터베이스 변경 이력을 추적하면 성능 모니터링에 도움이 됩니다.

참고 자료