피드로 돌아가기
Dev.toDatabase
원문 읽기
auth.uid() Wrap 최적화로 30초 쿼리를 30ms로 단축
The auth_rls_initplan linter has a blind spot: SECURITY DEFINER bodies
AI 요약
Context
RLS 정책 내 auth.uid() 직접 호출 시 발생하는 per-row evaluation으로 인한 성능 저하 문제. 기존 linter는 정책 표현식만 검사하여 SECURITY DEFINER 함수 내부에 숨겨진 호출을 감지하지 못하는 한계 존재.
Technical Solution
- scalar subselect 패턴을 통한 auth.uid() 호출의 InitPlan 전환 설계
- per-row evaluation 방식을 single InitPlan 호출 구조로 변경하여 반복 연산 제거
- SECURITY DEFINER 함수 내부의 쿼리 로직에 (SELECT auth.uid()) 형태의 래핑 적용
- 함수 수준의 depth까지 확장된 subselect 최적화를 통한 쿼리 계획 최적화
- pg_dump와 정규표현식 조합을 통한 함수 바디 내 미최적화 호출 지점 전수 조사
- EXPLAIN ANALYZE 기반의 Subplan 실행 횟수 분석을 통한 병목 지점 검증
실천 포인트
1. RLS 정책에서 호출하는 모든 SECURITY DEFINER 함수의 바디 내 auth.uid() 사용 여부 전수 조사
2. 함수 내부의 auth 호출부를 (SELECT auth.uid()) 형태로 래핑하여 InitPlan 유도
3. EXPLAIN ANALYZE를 통해 쿼리 실행 계획 중 row 수에 비례해 실행되는 Subplan 존재 여부 확인