概述
pg_embedding和pgvector都是基于PostgreSQL的扩展,是为Postgres数据库设计的向量运算插件,提供了高效的向量数据的存储、索引和查询功能。
自2023年9月29日起,Neon不再支持pg_embedding;现有扩展用户将继续得到支持,但强烈建议迁移到pgvector。
迁移指南请参阅Neon官方文档:从pg_embedding迁移到pgvector。
在 PostgreSQL 16.4 环境安装 pgvector 0.8.0
源码下载地址:
https://github.com/pgvector/pgvector
将pgvector-0.8.0.tar.gz上传服务器并解压。
然后编译安装:
cd pgvector-0.8.0
make && make install
进入psql客户端后,查看可用扩展:
SELECT name, default_version,installed_version FROM pg_available_extensions;
如果此前安装了embedding,需要将其卸载再加载vector:
DROP EXTENSION embedding CASCADE;
加载扩展插件:
CREATE EXTENSION IF NOT EXISTS vector;
检查已安装插件,结果如下:
postgres=# \dx vector
List of installed extensions
Name | Version | Schema | Description
--------+---------+--------+------------------------------------------------------
vector | 0.8.0 | public | vector data type and ivfflat and hnsw access methods
(1 row)
已正常安装。
注:standby节点无需再安装,插件会同步加载。
pgvector的使用可参考官网。
其他注意事项
类似这种编译安装的扩展插件,虽然standby节点插件能同步加载,在standby节点也需要进行编译安装(无需再加载),否则可能会在pg_dump时出现如下报错:
pg_dump: error: query failed: ERROR: could not access file "$libdir/vector": No such file or directory
在 PostgreSQL 16.4 环境安装 pg_embedding 0.3.6
源码下载地址:
https://github.com/neondatabase/pg_embedding
将pg_embedding-0.3.6.tar.gz上传服务器并解压。
确认主机是否支持avx指令:
cat /proc/cpuinfo | grep avx
然后进入目录,修改用于编译和构建项目的 Makefile:
cd pg_embedding-0.3.6
vim makefile
将原有的PG_CFLAGS注释掉,然后在对应位置新增一行:
PG_CFLAGS += -mavx2
然后编译安装:
make
make install
如果不修改PG_CFLAGS则会出现类似如下报错:
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -Ofast -fPIC -fvisibility=hidden -I. -I./ -I/usr/local/pg16/include/postgresql/server -I/usr/local/pg16/include/postgresql/internal -D_GNU_SOURCE -c -o distfunc.o distfunc.c
distfunc.c: In function ‘l2_dist_impl_avx2’:
distfunc.c:31:41: error: ‘__m256’ undeclared (first use in this function)
coord_t PORTABLE_ALIGN32 TmpRes[sizeof(__m256) / sizeof(float)];
^
distfunc.c:31:41: note: each undeclared identifier is reported only once for each function it appears in
distfunc.c:35:12: error: expected ‘;’ before ‘diff’
__m256 diff, v1, v2;
^
distfunc.c:36:12: error: expected ‘;’ before ‘sum’
__m256 sum = _mm256_set1_ps(0);
^
distfunc.c:37:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
dist_t res;
^
distfunc.c:40:9: error: ‘v1’ undeclared (first use in this function)
v1 = _mm256_loadu_ps(x);
^
distfunc.c:40:9: warning: implicit declaration of function ‘_mm256_loadu_ps’ [-Wimplicit-function-declaration]
distfunc.c:42:9: error: ‘v2’ undeclared (first use in this function)
v2 = _mm256_loadu_ps(y);
^
distfunc.c:44:9: error: ‘diff’ undeclared (first use in this function)
diff = _mm256_sub_ps(v1, v2);
^
distfunc.c:44:9: warning: implicit declaration of function ‘_mm256_sub_ps’ [-Wimplicit-function-declaration]
distfunc.c:45:9: error: ‘sum’ undeclared (first use in this function)
sum = _mm256_add_ps(sum, _mm256_mul_ps(diff, diff));
^
distfunc.c:45:9: warning: implicit declaration of function ‘_mm256_add_ps’ [-Wimplicit-function-declaration]
distfunc.c:45:9: warning: implicit declaration of function ‘_mm256_mul_ps’ [-Wimplicit-function-declaration]
distfunc.c:54:5: warning: implicit declaration of function ‘_mm256_store_ps’ [-Wimplicit-function-declaration]
_mm256_store_ps(TmpRes, sum);
^
distfunc.c:31:27: warning: unused variable ‘TmpRes’ [-Wunused-variable]
coord_t PORTABLE_ALIGN32 TmpRes[sizeof(__m256) / sizeof(float)];
^
make: *** [distfunc.o] Error 1
安装后即可加载扩展插件:
CREATE EXTENSION embedding;
同上,如果安装过vector需要提前卸载,否则会出现如下method冲突的报错:
ERROR: access method "hnsw" already exists
注意,扩展需要在对应库中加载,应先\c切换
最后修改时间:2025-02-11 15:18:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




