
PostgreSQL 17의 JSON_TABLE과 VACUUM 개편, 무엇이 달라졌을까
반정형 데이터를 관계형 표로 펼치는 JSON_TABLE
JSON 데이터를 데이터베이스에 보관하면서 겪던 오랜 고민을 직관적으로 해결하는 변화가 더해졌습니다. 그동안 PostgreSQL에서 JSON 객체나 배열 내부 값을 꺼내 조회하려면 jsonb\_array\_elements를 호출하고 화살표 연산자를 줄줄이 엮는 방식에 의존해야 했습니다. 코드가 길어질 뿐 아니라 가독성이 떨어져 유지보수가 까다로웠습니다.
PostgreSQL 17은 표준 SQL/JSON 규격인 JSON\_TABLE 함수를 기본 지원합니다. 복잡한 함수 체이닝 없이도 단일 질의문 안에서 JSON 배열을 일반 관계형 테이블의 행과 열로 바로 펼쳐낼 수 있습니다.
PostgreSQL 17 환경에서 실행 가능한 JSON\_TABLE 작성 예시입니다.
애플리케이션 계층에서 JSON 데이터를 내려받아 반복문으로 파싱하던 작업을 데이터베이스 내부에서 단 한 번의 쿼리로 처리할 수 있게 되었습니다.
대규모 테이블 관리의 부담을 덜어낸 VACUUM 메모리 구조
데이터베이스 운영에서 가장 까다로운 관리 작업인 VACUUM도 크게 개선되었습니다. 낡은 튜플을 청소하고 인덱스를 재정돈하는 과정에서 발생하는 높은 메모리 점유와 디스크 입출력 병목은 오랜 숙제였습니다.
PostgreSQL 17에서는 VACUUM 내부의 메모리 관리 구조를 새로 설계했습니다. 삭제 대상 튜플을 추적하는 메모리 소모량을 이전 대비 최대 20분의 1 수준으로 줄였습니다. 이전 버전까지 존재하던 작업 메모리(maintenance\_work\_mem)의 1GB 상한선도 해제되었습니다. 수억 건 이상의 레코드가 쌓인 대형 테이블에서도 인덱스 스캔을 불필요하게 여러 번 나누어 돌리지 않고 안정적인 메모리 상태로 정돈을 완료합니다.
스트리밍 입출력과 쿼리 플래너 최적화
질의 처리 엔진의 성능 향상도 주목할 부분입니다. 새로운 스트리밍 I/O 인터페이스가 도입되어 순차 스캔이나 통계 수집 작업을 수행할 때 필요한 블록들을 더 빠르게 미리 읽어 들입니다.
쿼리 플래너의 최적화 규칙 역시 확장되었습니다. IN 조건절에 다수의 검색 대상이 주어질 때 B-tree 인덱스 탐색 속도가 향상되었으며, 상호 연관된 IN 서브쿼리를 실행 단계에서 조인으로 자동 치환해 반복 계산으로 인한 지연을 줄입니다. 대용량 데이터를 다루는 집계 질의나 복잡한 조건문에서 체감 성능이 두드러집니다.
어떤 프로젝트가 도입하면 좋을까
외부 API 응답이나 로그를 JSONB 형식으로 저장해 두고 SQL로 자주 추출해 가공하는 서비스라면 코드 간결성과 성능 면에서 직접적인 혜택을 얻습니다. 데이터베이스가 JSON을 가상 테이블로 다뤄주므로 백엔드 서비스의 데이터 전처리 부담을 크게 덜 수 있습니다.
테이블 규모가 비대해져 VACUUM 도중 주기적으로 I/O 지연을 겪던 대용량 운영 환경에도 적합합니다. 메모리 제약으로 인해 인덱스 청소가 지연되던 문제를 완화해 시스템 자원을 일정하게 방어해 줍니다. 신규 아키텍처를 구성하거나 PostgreSQL 14, 15 버전에서 판올림을 준비 중인 팀이라면 적극적으로 도입을 권장합니다.
