피드로 돌아가기
Dev.toDatabase
원문 읽기
Index 내 addInfo 저장으로 Sort node를 제거한 RUM의 쿼리 최적화
RUM—Storing More in the Index
AI 요약
Context
GIN 인덱스는 검색 결과의 TID만 저장하여 정렬 및 랭킹 수행 시 Heap Tuple 전체를 Fetch한 후 별도의 Sort node를 거쳐야 하는 구조적 한계 존재. 특히 대규모 데이터셋에서 LIMIT 쿼리 수행 시 모든 매칭 항목을 스캔해야 하므로 응답 속도가 급격히 저하됨.
Technical Solution
- Posting List 내 TID와 함께 addInfo(timestamp, position 등)를 추가 저장하는 아키텍처 도입
- Index Scan 단계에서 addInfo 기준으로 데이터를 정렬하여 별도의 Sort node 없이 즉시 결과 반환
- Depth-first traversal 방식을 통해 Bitmap 접근 방식의 오버헤드를 제거하고 LIMIT 쿼리 최적화 구현
- Distance-based ordering(<=>) 연산자를 도입하여 ts_rank와 ts_rank_cd의 한계를 극복한 랭킹 모델 적용
- Phrase search 시 Index 단계에서 단어 위치 정보를 검증하여 Heap Recheck 과정 생략
- rum_tsvector_addon_ops를 통해 임의의 첨부 컬럼 기반 정렬 및 필터링 지원
실천 포인트
- Read-heavy 워크로드이며 Append-only 또는 Event-driven 데이터 구조인지 확인 - Full-text search 결과에 대해 정렬(ORDER BY) 및 상위 N개 추출(LIMIT)이 빈번한지 검토 - GIN 대비 증가하는 WAL 볼륨과 느린 Index Build/Insert 성능을 감내할 수 있는 쓰기 주기인지 분석 - 고유값이 많은 UUID 형태보다 자연어 텍스트 등 반복 키가 많은 데이터셋인지 확인