本文介紹了向量資料庫常見效能最佳化和監控操作。
載入
使用COPY批量載入向量。
COPY items (embedding) FROM STDIN WITH (FORMAT BINARY);為確保最佳效能,請在載入初始資料之後再添加任何索引。
索引
查詢
使用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);清理(Vacuuming)
對於HNSW索引,其清理過程可能需要消耗較長時間。為加速此過程,可以考慮先行重建索引。
REINDEX INDEX CONCURRENTLY index_name;
VACUUM table_name;監控
建立pg_stat_statements外掛程式監控查詢效能。
說明
建立pg_stat_statements外掛程式前請確認其已添加到shared_preload_libraries參數中。您可以通過控制台修改shared_preload_libraries參數。修改shared_preload_libraries參數後叢集將會重啟,請在修改參數前做好業務安排,謹慎操作。
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;擷取耗時前20的查詢語句:
說明對於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;