[Open WebUI] 메모리 업데이트 후 불필요한 재조회 쿼리 제거
PR 링크: open-webui/open-webui#21013 상태: Merged | 변경: +2 / -1
들어가며
SQLAlchemy에서 UPDATE 후 갱신된 레코드를 반환하는 패턴은 크게 두 가지가 있다. 하나는 UPDATE 실행 후 별도 SELECT로 다시 조회하는 것이고, 다른 하나는 이미 영속 상태인 객체를 db.refresh()로 갱신하는 것이다. Open WebUI의 메모리 업데이트 함수는 전자 방식을 사용하고 있었는데, self.get_memory_by_id가 새 세션을 열어 쿼리를 한 번 더 보내는 불필요한 오버헤드가 있었다.
핵심 코드 분석
Before: 커밋 후 별도 재조회
db.commit()
return self.get_memory_by_id(id) # 새 세션 + SELECT 쿼리 발생
After: 같은 세션에서 refresh
db.commit()
db.refresh(memory) # 같은 세션, 추가 SELECT 없이 최신 상태 반영
return MemoryModel.model_validate(memory)
왜 이게 좋은가
- 쿼리 수 절반 감소: UPDATE + SELECT 2회에서 UPDATE + refresh 1회로 줄어든다.
db.refresh()는 이미 영속 상태인 객체의 속성을 데이터베이스에서 다시 로드하지만, 같은 세션 컨텍스트에서 동작하므로 새 세션을 여는 비용이 없다. - 세션 관리 단순화:
get_memory_by_id가 내부적으로 새 세션을 열고 닫는 오버헤드를 완전히 제거한다. - Pydantic 변환 명시화:
MemoryModel.model_validate(memory)로 ORM 객체를 Pydantic 모델로 변환하는 과정이 코드에 명확히 드러난다.
단 2줄의 변경이지만, 매번 메모리가 업데이트될 때마다 절약되는 데이터베이스 왕복은 누적되면 상당한 차이를 만든다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Open WebUI] DB 쿼리 최적화: 루프 삭제를 벌크 연산으로 교체
- 현재글 : [Open WebUI] 메모리 업데이트 후 불필요한 재조회 쿼리 제거
- 다음글 [pydantic-ai] OpenAI prompt_cache_retention 리터럴 타입 오류 수정
댓글