常见性能优化及监控

本文介绍了向量数据库常见性能优化和监控操作。

加载

使用COPY批量加载向量

COPY items (embedding) FROM STDIN WITH (FORMAT BINARY);

为确保最佳性能,请在加载初始数据之后再添加任何索引。

索引

  • 优化HNSW索引创建索引构建时间

  • 在生产环境中,建议创建索引时使用PostgreSQL的并发模式,以避免阻塞写操作。

    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);

清理(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;