このトピックでは、ベクターデータベースの一般的なパフォーマンスの最適化と監視操作について説明します。
読み込み
ベクターの一括読み込みには、COPY を使用します。
COPY items (embedding) FROM STDIN WITH (FORMAT BINARY);最適なパフォーマンスを確保するために、初期データの読み込み後にインデックスを追加します。
インデックス作成
HNSW インデックスの作成を最適化し、インデックス構築時間を短縮します。
本番環境では、書き込み操作がブロックされないように、インデックスを同時作成します。
CREATE INDEX CONCURRENTLY ...
クエリ
パフォーマンスをデバッグするには、EXPLAIN ANALYZE を使用します。
EXPLAIN ANALYZE SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;完全一致検索
インデックスを使用できないクエリを高速化するために、
max_parallel_workers_per_gatherパラメーターを調整して、実行計画におけるパラレルクエリ機能を制御できます。 この値を適切に増やすと、集計やソートのために大量のデータを処理する場合のクエリのパフォーマンスが大幅に向上する可能性があります。SET max_parallel_workers_per_gather = 4;ベクターの長さが 1 に正規化されている場合は、最高のパフォーマンスを得るために内積を使用します。
SELECT * FROM items ORDER BY embedding <#> '[3,1,2]' LIMIT 5;
近似検索
IVFFlat インデックスを使用するクエリを高速化するには、反転リストの数を増やすことができます(ただし、取得率は低下します)。
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 1000);バキューム
HNSW インデックスのバキュームには長い時間がかかる場合があります。 このプロセスを高速化するには、最初にインデックスを再構築します。
REINDEX INDEX CONCURRENTLY index_name;
VACUUM table_name;監視
クエリのパフォーマンスを監視するには、pg_stat_statements 拡張機能を作成します。
pg_stat_statements 拡張機能を作成する前に、shared_preload_libraries に追加されていることを確認してください。 shared_preload_libraries パラメーターの変更によって、PolarDB コンソールで追加できます。 shared_preload_libraries パラメーターを変更すると、クラスターが再起動します。 ビジネス運用への影響を最小限に抑えるために、慎重に計画し、実行してください。
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;時間のかかる上位 20 件のクエリを検索します。
説明PolarDB for PostgreSQL 11 では、次のステートメントの
total_plan_time + total_exec_timeをtotal_timeに置き換えます。SELECT query, calls, ROUND((total_plan_time + total_exec_time) / calls) AS avg_time_ms, ROUND((total_plan_time + total_exec_time) / 60000) AS total_time_min FROM pg_stat_statements ORDER BY total_plan_time + total_exec_time DESC LIMIT 20;近似検索と完全一致検索の結果を比較して、取得率を監視します。
BEGIN; SET LOCAL enable_indexscan = off; -- 完全一致検索を使用します。 SELECT ... COMMIT;