すべてのプロダクト
Search
ドキュメントセンター

PolarDB:近似インデックス

最終更新日:Apr 26, 2025

デフォルトでは、pgvector は完全な再現率を提供する正確な近傍探索を実行します。検索速度を向上させるために、インデックスを追加することで近似近傍探索を実行できますが、再現率が低下する可能性があります。サポートされている近似インデックスの種類には、HNSWIVFFlat があります。

HNSW

階層型ナビゲーション可能な小世界 (HNSW) インデックスは、多層グラフを作成し、速度と再現率のトレードオフの観点から、反転ファイルとフラット圧縮 (IVFFlat) インデックスよりも優れたクエリ パフォーマンスを提供します。ただし、HNSW インデックスは、構築時間が長く、メモリ使用量が多くなります。 IVFFlat とは異なり、HNSW はトレーニングを必要とせず、テーブルにデータが含まれていない場合でも作成できます。

HNSW インデックスの作成

使用する距離関数ごとに HNSW インデックスを作成します。

ユークリッド距離 (L2)

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
説明

ベクトル型に基づいて距離関数を使用します。たとえば、halfvec ベクトル型には halfvec_l2_ops 関数を使用し、sparsevec ベクトル型には sparsevec_l2_ops 関数を使用します。

内積

CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);

コサイン距離

CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);

マンハッタン距離 (L1)

CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);

ハミング距離

CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops);

ジャカード距離

CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);

サポートされているベクトル型:

  • Vector: 最大 2,000 次元のベクトル。

  • Halfvec: 最大 4,000 次元の半精度ベクトル。

  • Sparsevec: 最大 1,000 個の非ゼロ要素を持つスパースベクトル。

  • Bit: 最大 64,000 次元のバイナリベクトル。

インデックス作成オプション

パラメーター

説明

m

レイヤーごとの最大接続数。デフォルト値: 16。

ef_construction

グラフの構築に使用される動的候補リストのサイズ。デフォルト値: 64。値が大きいほど再現率は向上しますが、インデックス作成が遅くなります。

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);

クエリ オプション

パラメーター

説明

hnsw.ef_search

検索中に使用される動的候補リストのサイズ。デフォルト値: 40。値が大きいほど再現率は向上しますが、クエリが遅くなります。

  • 現在のセッションの hnsw.ef_search パラメーターを指定します。

    SET hnsw.ef_search = 100;
  • SET LOCAL を使用して、単一のクエリのトランザクションで hnsw.ef_search を指定します。

    BEGIN;
    SET LOCAL hnsw.ef_search = 100;
    SELECT ...
    COMMIT;

IVFFlat

IVFFlat インデックスは、転置インデックスとベクトル検索の利点を組み合わせたものです。 IVFFlat インデックスは、ベクトルをリストに分割し、クエリベクトルに最も近いリストのサブセットを検索します。 HNSW よりも構築が速く、メモリ使用量が少なくなりますが、速度と再現率のトレードオフの観点からは、クエリ パフォーマンスが低下します。

良好な再現率を実現するには、次のガイドラインに従ってください。

  1. テーブルにデータを入力した後にインデックスを作成する

  2. 適切な数のリストを選択します。 100 万行までのデータセットの場合は rows/1000 から始め、100 万行を超えるデータセットの場合は sqrt(rows) を使用します。

  3. クエリ中に適切な数のプローブを指定します。プローブの数を増やすと再現率は向上しますが、クエリが遅くなる可能性があります。 sqrt(lists) を使用することをお勧めします。

IVFFlat インデックスの作成

使用する距離関数ごとに IVFFlat インデックスを作成します。

ユークリッド距離 (L2)

CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
説明

距離計算操作は、ベクトル型によって異なります。たとえば、halfvec ベクトル型には halfvec_l2_ops 操作を使用し、sparsevec ベクトル型には sparsevec_l2_ops 操作を使用します。

内積

CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);

コサイン距離

CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

ハミング距離

CREATE INDEX ON items USING ivfflat (embedding bit_hamming_ops) WITH (lists = 100);

サポートされているベクトル型:

  • Vector: 最大 2,000 次元のベクトル。

  • Halfvec: 最大 4,000 次元の半精度ベクトル。

  • Bit: 最大 64,000 次元のバイナリベクトル。

クエリ オプション

パラメーター

説明

ivfflat.probes

プローブの数。デフォルト値: 1。値が大きいほど再現率は向上しますが、クエリが遅くなります。プローブの数をリストの数と同じに設定して、正確な近傍探索を有効にすることができますが、この場合、プランナーはインデックスを使用しません。

SET LOCAL を使用して、単一のクエリのトランザクションで ivfflat.probes パラメーターを指定します。

BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;

インデックス構築の高速化

インデックス構築速度は、次のパラメーターによって異なります。

パラメーター

説明

maintenance_work_mem

インデックス構築に許可されるメモリの最大量。クラスターの仕様に基づいてパラメーターを調整します。グラフが maintenance_work_mem に収まる場合、インデックス構築速度は速くなります。それ以外の場合、システムは以下を表示します。

NOTICE: hnsw graph no longer fits into maintenance_work_mem after 100000 tuples
DETAIL: Building takes significantly more time.
HINT: Increase maintenance_work_mem to speed up building.
説明

サーバーのメモリ不足を防ぐために、適切な値を指定してください。

max_parallel_maintenance_workers

並列ワーカーの数。デフォルト値: 2。より多くの並列ワーカーを使用することで、インデックス作成を高速化できます。

SET max_parallel_maintenance_workers = 7; -- plus leader thread
説明

より多くのワーカーを使用するには、max_parallel_workers を増やします (デフォルトでは 8)。

他のインデックス タイプと同様に、初期データのロード後にインデックスを作成する方が高速です。 インデックス オプション も構築時間に大きく影響します。

インデックス構築の進捗状況の監視

pg_stat_progress_create_index ビューをクエリすることで、インデックス構築の進捗状況を監視できます。

  • HNSW インデックス構築フェーズ:

    1. initializing

    2. loading tuples

  • IVFFlat インデックス構築フェーズ:

    1. initializing

    2. performing k-means

    3. assigning tuples

    4. loading tuples

--- HNSW
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;

--- IVFFlat
SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
説明

% フィールドは、loading tuples フェーズ中にのみ更新されます。