업서트가 업데이트하지는 않지만 여전히 기록하는 경우: 대규모에서 Postgres 성능 디버깅하기
Datadog은 PostgreSQL 데이터베이스에서 수천 건의 호스트 메타데이터 업데이트를 효율적으로 처리하기 위해 업서트(upsert) 쿼리 최적화 사례를 공유합니다. 기존의 ON CONFLICT DO UPDATE 구문은 업데이트가 없어도 행을 잠그고 WAL(Write-Ahead Logging)에 기록하여 디스크 I/O와 WAL 동기화 비용이 급증하는 문제가 있었습니다. 이를 해결하기 위해 데이터 수정 CTE(Common Table Expression)를 활용한 새로운 쿼리 방식을 도입하여 불필요한 행 잠금과 WAL 기록을 줄이고, 1일 단위 갱신 조건을 적용해 성능과 정확성의 균형을 맞췄습니다. 이 과정에서 pg_walinspect 확장 기능을 활용해 WAL 기록을 직접 분석하며 문제를 진단하고 최적화한 점이 실용적 가치로 부각됩니다. 대규모 데이터베이스 운영 시 "무효 쿼리(no-op)"도 성능 저하를 유발할 수 있음을 보여주며, WAL 분석 도구의 중요성을 강조하는 기술적 인사이트를 제공합니다.
