본문으로 건너뛰기
16.2 자주 쓰는 확장

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_17
CREATE EXTENSION pg_repack;
pg_repack -d app_main -t orders

VACUUM 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/embeddingpgvector
지리 정보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를 봅니다.