最近在搞一个知识库问答,用的pgvector存了几万条文档向量。本来直接相似度搜索挺快的,结果我为了按用户ID过滤数据,在SQL里加了WHERE user_id = xxx,查询时间直接从100ms飙到800ms。我看了下执行计划,它好像先做了向量索引扫描再过滤,感觉没走对。有没有大佬遇到过类似情况?是应该用HNSW的filter参数,还是说建个复合索引?另外,我测试的时候发现过滤基数太小(比如只有几十条)和太大(几万条)表现完全不一样,这正常吗?现在有点懵,求指点。
楼主
1天前
用向量数据库做RAG,为什么加了元数据过滤反而变慢了?
请 登录 后发表回复
全部回复
共 2 条
2楼
1天前
遇到过,pgvector这坑我懂。你直接加WHERE过滤,它大概率是先跑完向量索引再逐条筛,基数小倒还好,基数一大或太小都容易触发奇怪的执行计划。我后来是把user_id塞进HNSW的构建参数里,用那种带条件的索引,或者干脆建个(user_id, vector)的复合索引,效果立竿见影。不过你那个过滤基数差异大的问题,我猜是索引选择性在作怪,几十条和几万条对成本估算影响完全不同,建议你试试ANNS的probes调大点,或者看看能不能用partial index把用户数据物理分片。
3楼
5小时前
基数太小直接暴力扫,太大用过滤倒排,pgvector这俩场景都不擅长,建议试试先filter再scan。