PostgreSQL은 확장(Extension) 시스템으로 기능을 동적으로 추가할 수 있다. pgvector(벡터 검색), PostGIS(지리정보), pg_trgm(유사도 검색) 등이 대표적이다.
pgvector: AI 벡터 검색
sql
-- 설치
CREATE EXTENSION vector;
-- 임베딩 컬럼 추가 (OpenAI text-embedding-ada-002: 1536차원)
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536)
);
-- 인덱스 생성 (HNSW: 빠른 근사 최근접 이웃)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- 코사인 유사도 검색 (가장 유사한 문서 5개)
SELECT content,
1 - (embedding <=> '[0.1, 0.2, ...]'::vector) AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 5;
-- 연산자:
-- <-> L2 거리 (유클리디안)
-- <#> 내적 (dot product, 음수 = 작을수록 유사)
-- <=> 코사인 거리
PostGIS: 지리정보 처리
sql
CREATE EXTENSION postgis;
CREATE TABLE stores (
id SERIAL PRIMARY KEY,
name TEXT,
location GEOGRAPHY(POINT, 4326) -- WGS 84 좌표계
);
-- 데이터 삽입 (경도, 위도 순서)
INSERT INTO stores (name, location) VALUES
('강남점', ST_MakePoint(127.0276, 37.4979)),
('홍대점', ST_MakePoint(126.9227, 37.5572));
-- 현재 위치(광화문)에서 5km 이내 매장
SELECT name,
ST_Distance(
location::geography,
ST_MakePoint(126.9769, 37.5760)::geography
) / 1000 AS distance_km
FROM stores
WHERE ST_DWithin(
location::geography,
ST_MakePoint(126.9769, 37.5760)::geography,
5000 -- 5000m = 5km
)
ORDER BY distance_km;
기타 유용한 확장
sql
-- pg_trgm: 오타 허용 유사도 검색
CREATE EXTENSION pg_trgm;
CREATE INDEX ON products USING gin (name gin_trgm_ops);
SELECT name, similarity(name, '삼성 갤럭시') AS sim
FROM products WHERE name % '삼성 갤럭시'
ORDER BY sim DESC;
-- uuid-ossp: UUID 생성
CREATE EXTENSION "uuid-ossp";
SELECT uuid_generate_v4();
-- pg_stat_statements: 쿼리 성능 분석
CREATE EXTENSION pg_stat_statements;
SELECT query, calls, mean_exec_time
FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;
-- timescaledb: 시계열 데이터
CREATE EXTENSION timescaledb;
SELECT create_hypertable('metrics', 'time');
관련 문서