본문으로 건너뛰기

[Open WebUI] 공유 채팅 삭제 시 전체 행 대신 ID만 조회하여 메모리 절약

PR 링크: open-webui/open-webui#23216 상태: Merged | 변경: +2 / -2

들어가며

채팅 데이터에는 대화 내용 전체가 JSON 형태로 저장된다. delete_shared_chats_by_user_id 함수는 사용자의 공유 채팅을 삭제하기 위해 해당 사용자의 모든 채팅 ID가 필요한데, 기존 구현에서는 db.query(Chat)으로 전체 행을 로드했다. JSON 블롭까지 포함된 전체 Chat 객체를 메모리에 올린 후 chat.id만 사용하는 낭비가 있었다.

핵심 코드 분석

Before: 전체 Chat 객체 로드

chats_by_user = db.query(Chat).filter_by(user_id=user_id).all()
shared_chat_ids = [f'shared-{chat.id}' for chat in chats_by_user]

After: ID 컬럼만 프로젝션

id_rows = db.query(Chat.id).filter_by(user_id=user_id).all()
shared_chat_ids = [f'shared-{row[0]}' for row in id_rows]

왜 이게 좋은가

  1. 메모리 사용량 대폭 감소: 채팅 하나당 수 KB~수 MB의 JSON 데이터를 메모리에 올리지 않는다. 사용자가 수백 개의 채팅을 가지고 있다면 차이가 극적이다.
  2. 네트워크/IO 비용 절감: 데이터베이스에서 애플리케이션으로 전송되는 데이터량이 ID 문자열만으로 줄어든다.
  3. SQLAlchemy의 프로젝션 활용: db.query(Chat.id)는 SQL SELECT id FROM chat WHERE ...으로 변환되어 데이터베이스 레벨에서도 불필요한 컬럼 읽기가 없다.

필요한 컬럼만 조회하는 것은 SQL 최적화의 기본 중 기본이지만, ORM을 사용할 때 쉽게 놓치는 부분이다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글