바쁜 개발자들의 사무실에서 가끔 들리는 ‘쿼리 성능’이라는 소리는 마치 오래된 시계를 수리하던 장인의 손길처럼 정밀함을 요구한다. 하지만 대부분의 경우 우리는 인덱스 한 줄에 걸맞은 눈빛만으로 충분한 듯 착각한다. 그때마다 Postgres가 제공하는 ‘확장 통계(extended statistics)’라는 작은 금속 조각이 잊혀지는 것이 현실이다.
확장 통계는 단순히 데이터 분포를 보여주는 도구가 아니다. 그것은 인덱스와 함께 동작하며, 서로 의존적인 관계를 학습해 쿼리 플래너에게 더 나은 실행 계획을 제시한다. 예컨대, 두 컬럼이 상호 연관성이 높은 경우, 일반 통계는 이를 놓치고 각 컬럼의 개별 분포만 알려주지만, 확장 통계는 그 결합을 인식해 조인 비용을 현격히 낮출 수 있다.
그런데 왜 이 기능이 오랫동안 ‘숨은 보석’으로 남아있었을까? 하나는 관리의 복잡성이다. CREATE STATISTICS 명령어를 직접 쓰고, 정기적으로 재수집해야 하는 부담이 있었고, ORM이나 마이그레이션 툴이 이를 자동화해 주지 않았다. 또 다른 이유는 단순히 인덱스만큼 눈에 띄는 성능 향상을 기대하기 어려웠던 점이다.
최근 몇몇 커뮤니티에서는 이 문제를 해결하려고 노력 중이다. 예컨대, danolivo/pg_index_stats 같은 경량 확장 모듈은 인덱스 정의와 연동해 자동으로 통계 객체를 만들며, 의존성을 관리한다. 또한 PostgreSQL 자체 문서에서도 CREATE STATISTICS 명령어에 대한 가이드를 제공하며, 사용자가 직접 설정할 수 있는 옵션을 폭넓게 열어 두었다.
그럼에도 불구하고, 실제 서비스에서는 여전히 확장 통계가 활용되지 않는 경우가 많다. 이는 ORM이 인덱스 생성 시 함께 통계를 만들지 않기 때문이다. 만약 ORM이나 마이그레이션 툴이 이 기능을 기본적으로 포함한다면, 개발자는 복잡한 쿼리 튜닝 없이도 성능 향상을 누릴 수 있을 것이다.
결국, 확장 통계는 ‘보이지 않는’ 데이터의 패턴을 드러내 주며, 인덱스와 함께 작동할 때 가장 빛난다. 그 잠재력을 깨닫고 활용한다면, 쿼리 성능 향상은 단순히 인덱스를 늘리는 것이 아니라, 데이터 자체를 더 똑똑하게 읽는 것에 달려있다는 사실을 다시 한 번 상기시켜 준다.
원문 링크
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.