Contents
see ListPostgreSQL 18이 2025년 9월에 정식 출시된 이후 실무에서 본격 활용되고 있습니다. 비동기 I/O, 향상된 JSON 기능, 가상 생성 열, 개선된 논리적 복제 등 성능과 편의성 모두를 강화한 메이저 업데이트입니다. 2026년 현재 PostgreSQL은 Stack Overflow Developer Survey에서 가장 많이 사용되는 DBMS로, 새 기능을 빠르게 익혀두면 큰 이점이 있습니다.
1. 비동기 I/O (Asynchronous I/O)
PostgreSQL 18에서 가장 기대를 모은 기능입니다. 기존에는 디스크 읽기/쓰기가 동기적으로 처리되어 대용량 테이블 스캔 시 병목이 발생했지만, io_method 설정으로 비동기 I/O를 활성화하면 쿼리 성능이 크게 향상됩니다.
-- PostgreSQL 18 설정 파일 (postgresql.conf)
io_method = io_uring -- Linux: io_uring 사용
-- io_method = worker -- 다른 플랫폼: 워커 스레드 사용
-- 비동기 I/O 효과 확인
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM large_table WHERE category = 'electronics';
-- 결과 예시:
-- Seq Scan on large_table
-- Rows: 1,200,000
-- I/O Read Time: 120ms (기존 350ms에서 개선)
-- Shared Buffers Hit: 85%2. 가상 생성 열 (Virtual Generated Columns)
기존 STORED 생성 열은 디스크 공간을 차지했지만, VIRTUAL 생성 열은 쿼리 시점에 동적으로 계산되어 저장 공간을 절약합니다.
-- 가상 생성 열 생성
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC(10, 2),
tax_rate NUMERIC(4, 2) DEFAULT 0.10,
-- VIRTUAL: 디스크에 저장되지 않고 조회 시 계산
price_with_tax NUMERIC(10, 2)
GENERATED ALWAYS AS (price * (1 + tax_rate)) VIRTUAL,
-- STORED: 디스크에 저장됨 (기존 방식)
search_text TEXT
GENERATED ALWAYS AS (lower(name)) STORED
);
INSERT INTO products (name, price) VALUES ('Laptop', 1200.00);
SELECT name, price, price_with_tax FROM products;
-- name | price | price_with_tax
-- Laptop | 1200.00 | 1320.00
-- 가상 열도 WHERE 조건에 사용 가능
SELECT * FROM products WHERE price_with_tax > 1000;3. 향상된 JSON 기능
SQL/JSON 표준 함수가 대폭 확장되어 JSON 데이터 처리가 더욱 강력해졌습니다.
-- JSON_TABLE: JSON을 관계형 테이블로 변환
SELECT jt.*
FROM orders,
JSON_TABLE(
order_data, '$.items[*]'
COLUMNS (
item_name TEXT PATH '$.name',
quantity INT PATH '$.qty',
unit_price NUMERIC PATH '$.price',
total NUMERIC PATH '$.price'
DEFAULT 0 ON ERROR
)
) AS jt;
-- JSON_SERIALIZE / JSON_SCALAR
SELECT JSON_SERIALIZE('{"name": "test"}' FORMAT JSON);
SELECT JSON_SCALAR(42); -- JSON 숫자 값 생성
-- JSON_EXISTS: 경로 존재 여부 확인
SELECT * FROM orders
WHERE JSON_EXISTS(
order_data,
'$.items[*] ? (@.price > 100)'
);
-- JSON_QUERY: 하위 JSON 객체 추출
SELECT JSON_QUERY(
order_data,
'$.shipping' WITH WRAPPER
) FROM orders;4. MERGE 문 개선
UPSERT보다 강력한 MERGE 문에 RETURNING 절이 추가되었습니다.
-- MERGE + RETURNING: 변경된 행 반환
MERGE INTO inventory AS target
USING incoming_shipment AS source
ON target.product_id = source.product_id
WHEN MATCHED THEN
UPDATE SET
quantity = target.quantity + source.quantity,
updated_at = NOW()
WHEN NOT MATCHED THEN
INSERT (product_id, quantity, updated_at)
VALUES (source.product_id, source.quantity, NOW())
RETURNING merge_action(), target.*;
-- merge_action()은 'INSERT' 또는 'UPDATE' 반환
-- 어떤 행이 추가/수정되었는지 한 번에 확인 가능5. 논리적 복제 개선
-- 논리적 복제에서 DDL도 복제 가능 (pg 18)
ALTER PUBLICATION my_pub SET (
publish = 'insert, update, delete, truncate',
publish_generated_columns = 'stored'
);
-- 복제 슬롯 동기화 개선
SELECT * FROM pg_replication_slots;
-- failover 컬럼 추가: 장애 시 자동 전환 지원
-- 구독 측 충돌 해결
ALTER SUBSCRIPTION my_sub
SET (disable_on_error = false);
-- 에러 시 자동 재시도6. 성능 최적화 팁
-- 인덱스 압축 (PostgreSQL 18 기본 활성화)
CREATE INDEX idx_orders_date ON orders (order_date)
WITH (deduplicate_items = on);
-- 파티션 프루닝 개선 확인
EXPLAIN (ANALYZE)
SELECT * FROM orders_partitioned
WHERE order_date BETWEEN '2026-01-01' AND '2026-03-31';
-- 해당 파티션만 스캔하는지 확인
-- 통계 수집 개선
ALTER TABLE orders ALTER COLUMN status SET STATISTICS 500;
ANALYZE orders;
-- 새로운 쿼리 플래너 힌트
SET enable_async_append = on; -- 비동기 Append 활성화
SET effective_io_concurrency = 200; -- I/O 동시성 설정7. 관리 편의 기능
-- pg_stat_io: I/O 통계 뷰 (18에서 확장)
SELECT backend_type, object, reads, writes, extends,
op_bytes, evictions
FROM pg_stat_io
WHERE reads > 0
ORDER BY reads DESC;
-- pg_wait_events: 대기 이벤트 상세 정보
SELECT * FROM pg_wait_events
WHERE type = 'IO';
-- 온라인 테이블 리라이트 진행률 확인
SELECT * FROM pg_stat_progress_copy;
-- 권한 부여 간소화
GRANT pg_maintain TO app_admin; -- 유지보수 작업 권한
GRANT pg_use_reserved_connections TO critical_app;PostgreSQL 18은 비동기 I/O로 성능의 근본적 한계를 돌파하고, 가상 열과 향상된 JSON으로 개발 생산성을 높이며, 논리적 복제 개선으로 운영 안정성을 강화했습니다. 기존 PostgreSQL 사용자라면 반드시 업그레이드를 검토해야 할 메이저 릴리스입니다.