「ベクトルDBが要るのは分かったけれど、新しいインフラを立てるのは大変」「既にPostgreSQLは運用している」。多くの組織が、新規インフラ導入に抵抗を感じます。pgvectorは、PostgreSQLにベクトル検索機能を足すOSS拡張モジュールで、この抵抗をゼロにする選択肢です。

2021年にApache 2.0ライセンスで公開され、AWS RDS・Azure Database・Cloud SQL・Supabaseなど主要マネージドPostgreSQLでも対応が進んでいます。シンプルさとSQL運用との一体化が強みです。基本構造と使い方を整理します。

pgvectorのセットアップ

-- 拡張を有効化(一度だけ)
CREATE EXTENSION vector;

-- ベクトルカラムを持つテーブル
CREATE TABLE documents (
    id BIGSERIAL PRIMARY KEY,
    title TEXT,
    content TEXT,
    embedding vector(1536)  -- OpenAI text-embedding-3-smallの次元
);

これだけで、PostgreSQLにベクトル型が追加され、テーブルに格納できます。既存のPostgreSQL運用にそのまま組み込めます。

ベクトル検索のクエリ

-- 近い順に取得(cosine類似度)
SELECT id, title, content, 1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;

-- メタデータフィルタとの組み合わせ
SELECT id, title
FROM documents
WHERE category = 'support'
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;

`<=>`がcosine距離、`<->`がeuclidean、`<#>`がdot productの演算子です。普通のSQLクエリにベクトル検索が混ざる感覚で、フィルタやJOINも自然に組み合わせられます。

インデックス:HNSWとIVFFlat

HNSWIVFFlat
検索速度速い
構築時間遅い速い
メモリ多い少ない
更新許容大量更新で再構築が要る
推奨大半のユースケース大規模初期構築・メモリ制約
-- HNSWインデックス(pgvector 0.5以降推奨)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);

多くのユースケースではHNSWが推奨です。検索速度と更新耐性のバランスが良く、特別な理由がなければHNSWを選びます。

Pinecone/Weaviateとの比較

pgvectorPineconeWeaviate
運用既存PostgreSQLに乗るマネージドSaaSOSS/Cloud両方
規模〜数千万ベクトル数億〜数十億数億〜数十億
SQL統合強力(JOIN等可)API経由GraphQL
性能
費用PostgreSQLコストのみ従量課金OSS無料、Cloud有料

「中規模まで」「既存PostgreSQLを活用」「SQL中心」ならpgvectorが圧倒的に手軽です。数億ベクトル超の超大規模では専用ベクトルDB(Pinecone/Weaviate)の性能優位が出ます。

マネージドPostgreSQLでの対応

  • AWS RDS:PostgreSQL 15以降でpgvectorサポート
  • Azure Database for PostgreSQL:拡張を有効化可能
  • Google Cloud SQL:拡張サポート
  • Supabase:pgvectorが標準提供
  • Neon:サーバーレスPostgreSQLでサポート

各マネージドサービスでサポートが進んでおり、特別な対応なくpgvectorを使えます。

運用上のハマりどころ

  • 性能の限界:数千万ベクトル超で検索性能が辛くなる。専用ベクトルDBへの移行を検討。
  • メモリ要件:HNSWはメモリ多めに使う。PostgreSQLのshared_buffersとの兼ね合いに注意。
  • 大規模初期構築の時間:HNSW構築は時間がかかる。バッチで時間外に行う。
  • 近似検索の精度:HNSWは近似検索なので100%正確ではない。`ef_search`パラメータで精度と速度のトレードオフを調整。

向く・向かない場面

  • 向く:既にPostgreSQL運用、データ量が中規模まで、SQL中心、運用シンプル化、コスト最小化
  • 向かない:数億〜超大規模(→Pinecone / Weaviate)、PostgreSQL未導入、ベクトル検索が業務の主要要件で性能優位が必要

まとめ

  • pgvectorはPostgreSQLにベクトル検索を足すOSS拡張モジュール。
  • 既存PostgreSQLにそのまま乗り、SQL運用と一体化できる。
  • HNSWインデックスで高速ベクトル検索、メタデータフィルタ・JOINも自然に組める。
  • 主要マネージドPostgreSQL(RDS、Cloud SQL、Azure、Supabase等)でサポート。
  • 中規模までは最有力の選択肢。超大規模なら専用ベクトルDBに移行検討。

全体像はベクトルDBとLLM向けデータ基盤、隣接はPinecone とはWeaviate とは。pgvector導入の壁打ちは、DE-STKの初回相談(30分・無料)もご利用ください。

よくある質問(FAQ)

Q. pgvectorは何ベクトルまで実用的?

A. ハードウェアにもよりますが、数百万〜数千万ベクトル程度は実用的に動きます。1億超になると、性能チューニングが必須で、本格的にはPinecone/Weaviateの方が向きます。「自社のデータ量と将来予測」を踏まえて選びます。

Q. PostgreSQLの論理レプリケーションでpgvectorは流せる?

A. 流せます。ベクトル型もVARLENA型扱いなので、論理レプリケーションで他のPostgreSQLにレプリ可能です。Read Replicaにベクトル検索を寄せる、というアーキテクチャも組めます。論理レプリケーションの詳細はPostgreSQL論理レプリケーションを参照してください。

Q. dbtでpgvectorのテーブルを管理できる?

A. できます。dbtのモデルで`vector(N)`型のカラムを宣言し、Embedding計算済みのデータをロードする運用が組めます。「dbtでSilver/Goldを作り、Embedding計算してpgvectorカラムに保存」というパイプラインが現実的です。dbtの基本はdbt実装ガイドを参照してください。

Q. pgvectorのインデックス更新は?

A. HNSWはINSERT/UPDATEに対応し、ベクトルが追加されると自動的にインデックスが更新されます。ただし、大量の更新があると徐々に性能が劣化することがあり、定期的なREINDEXが現実的な運用です。バッチで大量データを入れる場面では、インデックスを一旦DROPして全件INSERT後にCREATEするのが速いです。

▼ このトピックをポチポチ学ぶ

LLM/RAGの基礎から実装まで

関連記事を順序立てて読みながら、ステップごとに4択クイズで理解を確認できる学習パスです。登録不要・進捗自動保存。

学習パスを始める →