PostgreSQL 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 사용자라면 반드시 업그레이드를 검토해야 할 메이저 릴리스입니다.