[Open WebUI] 파일 쿼리 시 필요한 컬럼만 조회하여 성능 개선
PR 링크: open-webui/open-webui#18013 상태: Merged | 변경: +3 / -1
들어가며
Open WebUI에서 파일 메타데이터를 ID 목록으로 조회하는 get_file_metadatas_by_ids 함수가 전체 컬럼을 조회하고 있었습니다. 파일 테이블에는 실제 파일 데이터나 대용량 바이너리 컬럼이 포함될 수 있는데, 메타데이터 응답에 필요한 것은 id, meta, created_at, updated_at 4개 컬럼뿐이었습니다.
핵심 코드 분석
Before: 전체 컬럼 조회
for file in db.query(File)
.filter(File.id.in_(ids))
.order_by(File.updated_at.desc())
.all()
db.query(File)은 File 모델의 모든 컬럼을 SELECT합니다. 파일에 data 같은 대용량 컬럼이 있다면, 사용하지 않는 데이터까지 DB에서 전송받고 메모리에 로드합니다.
After: 필요한 컬럼만 조회
for file in db.query(
File.id, File.meta, File.created_at, File.updated_at
)
.filter(File.id.in_(ids))
.order_by(File.updated_at.desc())
.all()
db.query(File.id, File.meta, File.created_at, File.updated_at)로 필요한 4개 컬럼만 지정합니다.
왜 이게 좋은가
- 데이터 전송량 감소: DB에서 애플리케이션으로 전송되는 데이터량이 줄어듭니다. 특히 파일 테이블에 바이너리 데이터나 대용량 텍스트 컬럼이 있는 경우 효과가 큽니다.
- 메모리 사용량 감소: ORM이 불필요한 컬럼 데이터를 Python 객체로 변환하지 않아 메모리 할당이 줄어듭니다.
- 쿼리 최적화: DB 엔진이 불필요한 컬럼의 I/O를 건너뛸 수 있어, 특히 컬럼 스토어 기반 DB에서 성능 향상이 큽니다.
단 2줄의 변경으로 쿼리 성능을 개선한 깔끔한 최적화입니다. SELECT * 대신 필요한 컬럼만 지정하는 것은 DB 성능 최적화의 기본이지만, ORM 사용 시 자주 간과되는 패턴입니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Triton] debuginfo 테스트 단순화 — subprocess 제거
- 현재글 : [Open WebUI] 파일 쿼리 시 필요한 컬럼만 조회하여 성능 개선
- 다음글 [pydantic-ai] 병렬 tool call 제한 적용 방식 개선 — 사전 검증으로 전환
댓글