先把当时的情况摆出来。给 1536 维的向量列建索引时报 index row size exceeds maximum,换 HNSW 也提示类似错误。
真正麻烦的地方在于,几个原因的现象几乎一样。向量维度高,单行索引体积超过页大小限制。另一种情况是表里还有很长的文本列被一起索引。
另外,用的是 btree 而不是向量索引。少数情况下是数据页大小配置较小。
上来先改用支持高维的 HNSW 索引
CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops);
ivfflat 方案下按数据量设置 lists
CREATE INDEX ON docs USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
接着确认索引已创建
SELECT indexname FROM pg_indexes WHERE tablename='docs';
剩下的就是查询时设置探测数量
SET ivfflat.probes = 10;
当时还开着另一个排查窗口,两边日志对照着看才定位到。
怎么算真的好了,看的是同一批现象。索引创建成功,查询计划显示使用了该索引,检索延迟从全表扫描的秒级降到几十毫秒,召回也保持稳定。
补一句。lists 的经验值是行数的平方根,数据量差异很大时照搬教程的数值,召回率会明显偏低。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。