内容提要
pgvector 0.6.0发布,显著提升了HNSW索引的并行构建速度,未记录表的构建速度提高至30倍。新版本支持多线程构建,1百万个1536维向量的索引构建时间从1小时27分钟缩短至9.5分钟,性能提升显著。
延伸解读
并行构建的调优参数
pgvector 0.6.0 通过 max_parallel_maintenance_workers 参数控制并行构建索引的线程数。文章建议将其设置为 CPU 核心数的一半,这也是 Supabase 平台的默认值。测试表明,该参数不影响索引的准确率和查询每秒(QPS),因此可以放心调整以加速构建。
未记录表:以可靠性换取速度
未记录表(unlogged table)不将修改写入预写式日志(WAL),从而跳过索引构建中不可并行的最终扫描和 WAL 写入步骤。对于嵌入数据,原始数据通常另行存储且可重新生成,因此使用未记录表是合适的。文章数据显示,在 ef_construction=200 时,构建时间从 1 小时 27 分缩短至 3 分 37 秒,提升约 24 倍。
性能提升的边界与成本权衡
并行构建的加速比并非与核心数线性增长。在 16 核实例上,0.6.0 比 0.5.1 快 7-9 倍;在 64 核实例上,提升可达 13.5 倍。文章还提到一个节省成本的技巧:在大型实例上构建索引,完成后切换回较便宜的实例。这利用了构建阶段需要更多计算资源,而查询阶段资源需求较低的特点。
Q&A
pgvector 0.6.0的主要改进是什么?
pgvector 0.6.0显著提升了HNSW索引的并行构建速度,未记录表的构建速度提高至30倍。
使用pgvector 0.6.0构建索引的时间有多大变化?
构建1百万个1536维向量的索引时间从1小时27分钟缩短至9.5分钟,速度提升了9倍。
pgvector 0.6.0如何支持多线程构建?
新版本支持多线程构建,解决了大数据集构建的瓶颈,允许使用多个线程同时构建索引。
未记录表在pgvector中的作用是什么?
未记录表的修改不记录在写前日志中,适合嵌入数据,可以进一步减少构建时间。
pgvector 0.6.0与0.5.1版本在性能上有什么比较?
0.6.0版本的索引构建时间比0.5.1快7-9倍,查询每秒和准确率保持不变。
如何进一步优化pgvector的索引构建性能?
可以使用更强大的实例进行索引构建,构建完成后再切换回更便宜的实例。