PostgreSQL 18, Aurora/RDS에서 성능 대폭 향상!

by DD
4시간 전
조회수 0

PostgreSQL 18은 복합 인덱스 쿼리 성능을 개선하기 위해 스킵 스캔(skip scan) 최적화를 도입함

EXPLAIN ANALYZE 기능이 향상되어 버퍼 통계 및 인덱스 검색 횟수를 기본 제공하며, CTE 스토리지 진단 기능이 강화됨

셀프 조인 제거(Self-Join Elimination, SJE) 기능으로 ORM이 생성하는 불필요한 조인을 자동으로 제거하여 쿼리 효율성 증대

autovacuum_vacuum_max_threshold 파라미터 도입으로 대용량 테이블의 autovacuum 지연 문제 해결 및 vacuum_truncate GUC로 파일 truncation 동작 제어 강화

다중 컬럼 인덱스를 위한 스킵 스캔(Skip Scan) 최적화

PostgreSQL 18은 다중 컬럼 B-트리 인덱스의 활용도를 높이는 스킵 스캔(skip scan) 최적화를 도입했습니다. 이전 버전에서는 쿼리가 WHERE절에 복합 인덱스의 선행 컬럼을 명시해야만 인덱스를 효율적으로 사용할 수 있었으나, 이제는 선행 컬럼이 지정되지 않아도 인덱스의 고유 값들을 건너뛰며(skip) 후행 컬럼에 대한 인덱스 사용이 가능해졌습니다. 이는 특히 선행 컬럼의 카디널리티가 낮거나 쿼리가 후행 컬럼을 필터링하는 경우에 유용하며, 별도의 인덱스 추가 없이도 성능을 최대 21배 향상시키는 효과를 보입니다. 저장 공간 오버헤드와 유지 관리 비용 없이 전용 단일 컬럼 인덱스와 유사한 성능을 제공하는 것이 장점입니다.

향상된 EXPLAIN 기능: CTE 스토리지 및 인덱스 탐색 분석

PostgreSQL 18의 EXPLAIN 기능은 쿼리 성능 분석의 정확성과 편의성을 크게 향상시켰습니다. EXPLAIN ANALYZE버퍼 통계(Buffer Statistics)가 기본 포함되어 I/O 정보를 명시적으로 요청할 필요가 없어졌으며, 구체화된 CTE(Common Table Expression)의 메모리 및 디스크 사용량(Storage, Maximum Storage)을 상세히 보고하여 튜닝의 정확성을 높였습니다. 또한, Index Searches 지표는 IN 절 등에서 인덱스 트리 탐색 횟수를 보여주어, 비효율적인 인덱스 사용 패턴을 식별하고 BETWEEN 조건으로 변경하는 등의 최적화 기회를 제공합니다. 이러한 개선은 데이터 기반의 튜닝 결정을 가능하게 합니다.

셀프 조인 제거(Self-Join Elimination, SJE)의 효율성

PostgreSQL 18에 새로 추가된 셀프 조인 제거(SJE) 기능은 기본 키(Primary Key) 또는 고유 키(Unique Key)를 조인 조건으로 하는 불필요한 셀프 조인을 쿼리 플래너가 자동으로 감지하고 제거합니다. ORM(Object-Relational Mapping) 도구에서 흔히 발생하는 이러한 비효율적인 조인은 테이블을 한 번만 스캔하도록 쿼리를 재작성하여 제거됩니다. 예를 들어, `employees` 테이블을 `id` 기준으로 조인하는 경우, PostgreSQL 17에서는 실제 조인이 수행되었지만 PostgreSQL 18에서는 단일 스캔으로 대체되어 실행 시간을 단축합니다. 이 기능은 SELECT 쿼리에만 적용되며, DML(Data Manipulation Language) 문에서의 SJE는 향후 릴리스에서 지원될 예정입니다.

autovacuum_vacuum_max_threshold를 통한 대규모 테이블 관리

PostgreSQL 18은 autovacuum_vacuum_max_threshold 파라미터를 도입하여 대규모 테이블의 autovacuum 지연 문제를 해결합니다. 이 파라미터는 autovacuum이 VACUUM을 트리거하기 전 누적될 수 있는 데드 튜플 수에 전역적인 상한선을 설정합니다. 이전에는 테이블 크기에 따라 임계값이 지나치게 높아져 autovacuum이 늦어지는 문제가 있었으나, 이제는 이 상한선 덕분에 10억 행 테이블에서도 최대 1억 개의 데드 튜플까지만 누적된 후 VACUUM이 실행됩니다. 이는 테이블 팽창, 쿼리 성능 저하, 트랜잭션 ID 랩어라운드 위험을 줄여줍니다. 이 설정은 파라미터 그룹을 통해 런타임에 조정 가능합니다.

vacuum_truncate GUC를 통한 파일 Truncation 제어

PostgreSQL 18의 vacuum_truncate 서버 전역 GUC(Grand Unified Configuration)는 VACUUM 작업 시 파일 truncation 동작을 제어합니다. Truncation은 테이블 끝의 빈 페이지를 제거하여 디스크 공간을 OS에 반환하지만, AccessExclusiveLock을 요구하여 OLTP 시스템이나 읽기 전용 복제본에서 쿼리 취소(canceling statement due to conflict with recovery)를 유발할 수 있습니다. 이 GUC를 `off`로 설정하면 truncation이 비활성화되어 이러한 잠금 충돌을 방지할 수 있습니다. 기본값은 `on`이며, 파라미터 그룹을 통해 전역적으로 설정하거나 테이블별로 재정의할 수 있어, 데이터베이스 관리의 유연성을 높입니다.

autovacuum_worker_slots와 autovacuum_max_workers 분리

PostgreSQL 18은 autovacuum 워커 슬롯 할당과 사용을 분리하는 autovacuum_worker_slotsautovacuum_max_workers 파라미터를 도입했습니다. `autovacuum_worker_slots`는 서버 시작 시 예약되는 최대 백엔드 슬롯 수를 정의하며 재시작이 필요하지만, `autovacuum_max_workers`는 런타임에 조정 가능하여 서버 재시작 없이 autovacuum 동시성을 늘릴 수 있습니다. 이는 쓰기가 많은 기간 동안 autovacuum 워커 수를 동적으로 늘려 테이블 팽창을 효과적으로 관리하는 데 중요한 운영상 개선점입니다. 기본값은 각각 16개와 3개이며, `autovacuum_max_workers`는 `autovacuum_worker_slots`를 초과할 수 없습니다.

Amazon Aurora 및 Amazon RDS의 PostgreSQL 18: 성능 향상