pgvector性能测试(基于IVF索引)

更新时间:2025-02-19 05:11:51

本文介绍RDS PostgreSQL实例vector插件基于IVF索引的性能测试,使用pgbench工具进行评估,将分别展示向量数据及其索引在不同数据量下所占用的存储空间情况,并分析设置不同的lists值和probes值对查询效率及召回率的影响。

测试环境

RDS PostgreSQL实例与客户端ECS应位于同一VPC和交换机,以避免网络波动带来的误差。

测试实例及工具

说明

测试实例及工具

说明

RDS PostgreSQL实例规格

  • 大版本:RDS PostgreSQL 16

  • 规格:标准版高可用系列独享型规格,pg.x8.2xlarge.2c(16核 128GB)

  • pgvector插件版本:0.8.0

客户端ECS规格

  • 规格:ecs.c6.xlarge(4核 8GiB)

  • 操作系统:Alibaba Cloud Linux 3

  • PostgreSQL客户端:15.1

测试工具

pgbench

准备工作

  1. 创建高权限账号testuser和测试数据库testdb,详情请参见创建账号和数据库

  2. 在测试数据库testdb中安装插件vector,详情请参见管理插件

  3. 连接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;
  4. 创建一个存储1536维向量的表。

    CREATE TABLE vtest(id BIGINT, v VECTOR(1536));
  5. 向表中插入数据。

    INSERT INTO vtest SELECT i, random_array(1536)::VECTOR(1536) FROM generate_series(1, 100000) AS i;
  6. 建立索引。

    CREATE INDEX ON vtest USING ivfflat(v vector_cosine_ops) WITH(lists = 100);

测试步骤

为避免网络延迟等因素对测试数据的影响,推荐使用内网连接地址,本示例是在与RDS PostgreSQL同地域、同VPC下的ECS中进行测试。

  1. 使用一个随机向量,与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);
  2. 使用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为例。

测试结果

向量数据、索引数据占用的存储空间以及TPS与数据量之间的测试结果

数据量(单位:万行)

table size(单位:MB)

index size(单位:MB)

Latency(单位:ms)

TPS(单位:个)

10

796

782

15.7

380

30

2388

2345

63

94

50

3979

3907

74

80

80

6367

6251

90

66

100

7958

7813

105

56

lists固定时probes对查询效率以及召回率的影响

lists固定为2000,表中数据量为100万行时,probes越大召回率越高,TPS越低。

image..png

probes固定时lists对查询效率以及召回率的影响

probes固定为20,表中数据量为100万行时,lists越大,召回率越低,TPS越高。

image..png

测试结论

  • lists的值对索引占用的存储空间影响微乎其微,和表中的数据量有直接的关系。

  • listsprobes对查询效率以及召回率起着相反的作用,因此合理地设置这两个值可以在查询效率以及召回率之间达到一个平衡。

    image..png

    根据表中行数(rows)的不同,建议设置的listsprobes值如下:

    • 小于等于100万行:lists = rows / 1000probes = lists / 10

    • 大于100万行:lists = sqrt(rows)probes = sqrt(lists)

      说明

      sqrt表示开方运算。

  • 本页导读 (1)
  • 测试环境
  • 准备工作
  • 测试步骤
  • 测试结果
  • 测试结论