16.2 자주 쓰는 확장
PostgreSQL 운영에서 자주 마주치는 확장 9개의 용도·기본 사용법·주의사항을 정리합니다. 자세한 매뉴얼은 각 확장의 공식 docs.
1. pg_stat_statements
쿼리 통계 — 10.5에서 다룹니다. 운영 클러스터의 거의 필수입니다.
CREATE EXTENSION pg_stat_statements;2. pgcrypto
해시·암호화 함수. 비밀번호 저장·HMAC·암호화 컬럼에 표준입니다.
CREATE EXTENSION pgcrypto;
-- 비밀번호 해시 (bcrypt-like)
SELECT crypt('mypassword', gen_salt('bf', 12));
-- 검증
SELECT crypt('mypassword', stored_hash) = stored_hash;
-- 대칭 암호화
SELECT pgp_sym_encrypt('secret data', 'encryption_key');
SELECT pgp_sym_decrypt(encrypted_col::bytea, 'encryption_key');
-- HMAC
SELECT hmac('message', 'key', 'sha256');
-- UUID
SELECT gen_random_uuid();운영 권장:
- 비밀번호는 application 또는 PostgreSQL 한 곳에서만 해시
- 암호화 키는 PostgreSQL에 저장하지 말 것 (외부 secret manager)
3. pg_trgm
trigram 기반 텍스트 유사도·LIKE '%foo%' 가속. 6.4에서 GIN과 함께 다룹니다.
CREATE EXTENSION pg_trgm;
CREATE INDEX ON users USING gin (name gin_trgm_ops);
SELECT * FROM users WHERE name ILIKE '%kim%';
SELECT * FROM users WHERE name % 'gimm' ORDER BY name <-> 'gimm';검색 UX·로그 분석에 표준입니다.
4. pg_partman
자동 파티션 관리 — 7.5에서 자세히. 시계열 운영 표준입니다.
CREATE EXTENSION pg_partman;
SELECT partman.create_parent(p_parent_table := 'public.events', p_control := 'created_at', ...);5. pgvector
벡터 데이터 타입·유사도 검색. AI·임베딩·RAG의 표준입니다.
CREATE EXTENSION pgvector;
CREATE TABLE items (
id bigserial PRIMARY KEY,
embedding vector(1536) -- OpenAI ada-002 차원
);
-- 유사도 검색 (cosine distance)
SELECT id, 1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM items
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 10;
-- HNSW 인덱스 (PG 16+, pgvector 0.5+)
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);
-- IVFFlat 인덱스 (옛 옵션)
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);| 거리 | 연산자 | 의미 |
|---|---|---|
| L2 (Euclidean) | <-> | √(sum (a-b)²) |
| Negative inner product | <#> | -⟨a,b⟩ |
| Cosine distance | <=> | 1 - cos(θ) |
| L1 (Manhattan) | <+> | sum |
| Hamming (binary) | <~> | XOR popcount |
운영 주의:
- 벡터는 크고 압축 어려움 — 1M row × 1536 dim × 4B = 6GB
- 인덱스 빌드 시간 큼 —
maintenance_work_mem큰 값 - quantization (PG 18+ pgvector) — 메모리 절약
6. postgis
지리 정보 시스템. geometry·geography 타입, 1500+ 함수, GiST 인덱스.
CREATE EXTENSION postgis;
CREATE TABLE parcels (
id bigserial PRIMARY KEY,
name text,
geom geometry(Polygon, 4326)
);
CREATE INDEX ON parcels USING gist (geom);
-- 공간 쿼리
SELECT name FROM parcels
WHERE ST_Intersects(geom, ST_MakeEnvelope(127.0, 37.5, 127.1, 37.6, 4326));
-- 거리
SELECT name, ST_Distance(geom::geography, ST_GeogFromText('POINT(127.0 37.5)')) AS distance_m
FROM parcels
ORDER BY distance_m
LIMIT 10;매우 큰 확장 — 별도 책 한 권. 운영자는 기본 함수와 인덱스 활용까지.
7. pg_cron
DB 안의 cron — 정기 작업을 PostgreSQL이 직접 실행합니다.
CREATE EXTENSION pg_cron;
-- 매시간 vacuum
SELECT cron.schedule('hourly-vacuum', '0 * * * *', $$VACUUM ANALYZE big_table$$);
-- 매일 파티션 maintenance
SELECT cron.schedule('partman', '0 1 * * *', $$SELECT partman.run_maintenance()$$);
-- 목록
SELECT * FROM cron.job;
-- 제거
SELECT cron.unschedule('hourly-vacuum');OS cron 대안. PostgreSQL 안에서 job 정의·실행합니다. 매니지드 클라우드(RDS·NCP)도 지원합니다.
8. pg_repack
테이블·인덱스 BLOAT 정리 — 8.3에서 다룹니다.
sudo dnf install -y pg_repack_17CREATE EXTENSION pg_repack;pg_repack -d app_main -t ordersVACUUM FULL의 운영 친화 대안.
9. hypopg
가상 인덱스로 만들지 않고 plan 효과 미리 보기.
CREATE EXTENSION hypopg;
-- 가상 인덱스
SELECT hypopg_create_index('CREATE INDEX ON orders(user_id, status)');
-- EXPLAIN이 그 인덱스 사용한 plan
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
-- 정리
SELECT hypopg_reset();운영 인덱스 추가 전 효과 검증에 매우 유용합니다.
10. pg_hint_plan
옵티마이저 힌트 (Oracle 스타일). 5.7에서 다룹니다.
/*+ HashJoin(o u) IndexScan(o orders_user_id_idx) */
SELECT * FROM orders o JOIN users u ON o.user_id = u.id;매니지드 일부에서는 미지원.
11. citext (case-insensitive text)
CREATE EXTENSION citext;
CREATE TABLE users (
email citext UNIQUE
);
INSERT INTO users(email) VALUES ('A@B.com');
SELECT * FROM users WHERE email = 'a@b.com'; -- 매칭email·username 처럼 대소문자 구분 안 하는 컬럼에 유용합니다.
12. btree_gin / btree_gist
B-tree 타입(int·timestamp 등)을 GIN·GiST에서 쓸 수 있게 합니다. exclusion constraint 결합용.
CREATE EXTENSION btree_gist;
CREATE TABLE meetings (
room_id int,
when_range tsrange,
EXCLUDE USING gist (room_id WITH =, when_range WITH &&)
);운영 확장 선택 가이드
| 시나리오 | 권장 확장 |
|---|---|
| 운영 클러스터 | pg_stat_statements, pgaudit |
| 시계열 | pg_partman, BRIN |
| 비밀번호·암호화 | pgcrypto |
| 텍스트 검색 | pg_trgm + GIN |
| AI/embedding | pgvector |
| 지리 정보 | postgis |
| DB 안 스케줄링 | pg_cron |
| BLOAT 정리 | pg_repack |
| 인덱스 효과 시험 | hypopg |
| 옵티마이저 힌트 | pg_hint_plan |
정리
- pg_stat_statements·pgcrypto·pg_trgm은 운영 클러스터 기본 셋
- pgvector·postgis 같은 영역 확장은 애플리케이션 도메인 따라
- pg_partman·pg_repack은 운영 자동화 도구
- hypopg로 인덱스 변경 효과 미리 검증
- 클라우드 매니지드는 지원 확장 목록 사전 확인
다음 절(16.3)에서는 외부 시스템과 SQL로 통합하는 — Foreign Data Wrappers를 봅니다.