[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]
왜 이게 좋은가
- 메모리 사용량 대폭 감소: 채팅 하나당 수 KB~수 MB의 JSON 데이터를 메모리에 올리지 않는다. 사용자가 수백 개의 채팅을 가지고 있다면 차이가 극적이다.
- 네트워크/IO 비용 절감: 데이터베이스에서 애플리케이션으로 전송되는 데이터량이 ID 문자열만으로 줄어든다.
- SQLAlchemy의 프로젝션 활용:
db.query(Chat.id)는 SQLSELECT id FROM chat WHERE ...으로 변환되어 데이터베이스 레벨에서도 불필요한 컬럼 읽기가 없다.
필요한 컬럼만 조회하는 것은 SQL 최적화의 기본 중 기본이지만, ORM을 사용할 때 쉽게 놓치는 부분이다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Open WebUI] 매 인증 요청마다 실행되는 last_active 업데이트를 단일 UPDATE 쿼리로 최적화
- 현재글 : [Open WebUI] 공유 채팅 삭제 시 전체 행 대신 ID만 조회하여 메모리 절약
- 다음글 [vllm] DFlash - Block Diffusion 기반 Speculative Decoding
댓글