핵심 요약
PG18 Beta의 두 가지 변화 — multi-column index skip scan과 io_uring 기반 async I/O. 12억 row 주문 테이블 실측 4개 쿼리 6.2배, 인덱스 추가 없이도 즉시 효과. 단 io_uring은 커널 6.6+ 필수, RDS는 25년 Q4 예정.
1. Skip Scan — leading column 없이도 인덱스 사용
기존 PG는 idx(a, b, c) 인덱스에서 WHERE b=? 만으로는 seq scan. 18에서는 a의 distinct 값이 작으면 skip scan으로 인덱스 사용. distinct(a) < 200 정도까지 효과적.
CREATE INDEX ON orders(status, created_at, user_id);
-- PG17: seq scan
-- PG18: index skip scan, 4.1초 → 0.6초
EXPLAIN ANALYZE
SELECT * FROM orders WHERE created_at > now() - interval '7 days';
2. io_uring — read 병렬화
effective_io_concurrency 설정만으로 비동기 prefetch. bitmap heap scan, parallel seq scan에서 특히 효과. NVMe SSD에서 6배, 사내 ECMP 망 EBS에서 2.3배.
-- postgresql.conf
io_method = 'io_uring' # 또는 'worker', 'sync'
effective_io_concurrency = 256
maintenance_io_concurrency = 64
3. 실측 4개 쿼리
| 쿼리 | PG17 | PG18 | 배수 |
|---|---|---|---|
| range scan 7일치 | 4.1s | 0.6s | 6.8x |
| ANALYZE 1.2억 row | 28m | 9m | 3.1x |
| VACUUM full | 52m | 19m | 2.7x |
| 복합 JOIN | 12.4s | 2.8s | 4.4x |
4. 함정
- io_uring 커널 요구 — 6.6 미만이면 fallback to worker, 무음으로 느려짐
- skip scan은 distinct 많으면 역효과 — leading column에 1만+ 값이면 그냥 인덱스 분리
- Replication 호환 — 17 standby로 스트리밍 불가, 마이그레이션 동시 진행
- extension 호환 — pg_partman, TimescaleDB 18 지원은 6월 예정

댓글 0