본문으로 건너뛰기

[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)

왜 이게 좋은가

  1. 쿼리 수 절반 감소: UPDATE + SELECT 2회에서 UPDATE + refresh 1회로 줄어든다. db.refresh()는 이미 영속 상태인 객체의 속성을 데이터베이스에서 다시 로드하지만, 같은 세션 컨텍스트에서 동작하므로 새 세션을 여는 비용이 없다.
  2. 세션 관리 단순화: get_memory_by_id가 내부적으로 새 세션을 열고 닫는 오버헤드를 완전히 제거한다.
  3. Pydantic 변환 명시화: MemoryModel.model_validate(memory)로 ORM 객체를 Pydantic 모델로 변환하는 과정이 코드에 명확히 드러난다.

단 2줄의 변경이지만, 매번 메모리가 업데이트될 때마다 절약되는 데이터베이스 왕복은 누적되면 상당한 차이를 만든다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글