本文介绍RDS PostgreSQL实例vector插件基于IVF索引的性能测试,使用pgbench工具进行评估,将分别展示向量数据及其索引在不同数据量下所占用的存储空间情况,并分析设置不同的lists值和probes值对查询效率及召回率的影响。
测试环境
RDS PostgreSQL实例与客户端ECS应位于同一VPC和交换机,以避免网络波动带来的误差。
测试实例及工具 | 说明 |
测试实例及工具 | 说明 |
RDS PostgreSQL实例规格 |
|
客户端ECS规格 |
|
测试工具 | pgbench |
准备工作
创建高权限账号testuser和测试数据库testdb,详情请参见创建账号和数据库。
在测试数据库testdb中安装插件vector,详情请参见管理插件。
连接PostgreSQL实例,在测试数据库testdb中生成固定长度的随机向量作为测试数据。
CREATE OR REPLACE FUNCTION random_array(dim integer) RETURNS DOUBLE PRECISION[] AS $$ SELECT array_agg(random()) FROM generate_series(1, dim); $$ LANGUAGE SQL VOLATILE COST 1;
创建一个存储1536维向量的表。
CREATE TABLE vtest(id BIGINT, v VECTOR(1536));
向表中插入数据。
INSERT INTO vtest SELECT i, random_array(1536)::VECTOR(1536) FROM generate_series(1, 100000) AS i;
建立索引。
CREATE INDEX ON vtest USING ivfflat(v vector_cosine_ops) WITH(lists = 100);
测试步骤
为避免网络延迟等因素对测试数据的影响,推荐使用内网连接地址,本示例是在与RDS PostgreSQL同地域、同VPC下的ECS中进行测试。
使用一个随机向量,与vtest表中的数据进行相似度比对,获取比对结果中最相似的50条记录。
您需要创建一个SQL文件,然后写入如下内容,用于后续压测时使用。
WITH tmp AS ( SELECT random_array(1536)::VECTOR(1536) AS vec ) SELECT id FROM vtest ORDER BY v <=> (SELECT vec FROM tmp) LIMIT FLOOR(RANDOM() * 50);
使用pgbench进行压测。
如下命令需要在命令行窗口执行,请确保已安装PostgreSQL客户端(本示例以15.1为例),pgbench是在PostgreSQL上运行基准测试的简单程序。该命令的更多用法,请参见PostgreSQL官方文档。
pgbench -f ./test.sql -c6 -T60 -P5 -U testuser -h pgm-bp****.pg.rds.aliyuncs.com -p 5432 -d testdb
各参数及说明如下:
参数/取值
说明
参数/取值
说明
-f ./test.sql
指定测试脚本文件的路径和文件名。
./test.sql
仅为示例,您需要根据实际情况修改路径及文件名。-c6
设置并发客户端数。-c表示指定并发客户端数,6表示本示例指定了6个并发客户端来执行测试。
-T60
设置测试时间。-T表示指定测试的运行时间,60表示本示例指定测试将运行60秒。
-P5
设置脚本参数。表示本示例中每5秒显示一次进程报告。
-U testuser
指定数据库用户。testuser需要替换为您的数据库用户名。
-h pgm-bp****.pg.rds.aliyuncs.com
指定RDS PostgreSQL实例的内网连接地址。
-p 5432
指定RDS PostgreSQL实例的内网端口。
-d testdb
指定连接的数据库,本示例以testdb为例。
测试结果
测试结论
lists的值对索引占用的存储空间影响微乎其微,和表中的数据量有直接的关系。
lists和probes对查询效率以及召回率起着相反的作用,因此合理地设置这两个值可以在查询效率以及召回率之间达到一个平衡。
根据表中行数(rows)的不同,建议设置的lists和probes值如下:
小于等于100万行:
lists = rows / 1000
、probes = lists / 10
大于100万行:
lists = sqrt(rows)
、probes = sqrt(lists)
sqrt表示开方运算。
- 本页导读 (1)
- 测试环境
- 准备工作
- 测试步骤
- 测试结果
- 测试结论