全部產品
Search
文件中心

ApsaraDB RDS:pgvector效能測試(基於IVF索引)

更新時間:Feb 20, 2025

本文介紹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的值對索引佔用的儲存空間影響微乎其微,和表中的資料量有直接的關係。

  • lists和probes對查詢效率以及召回率起著相反的作用,因此合理地設定這兩個值可以在查詢效率以及召回率之間達到一個平衡。

    image..png

    根據表中行數(rows)的不同,建議設定的lists和probes值如下:

    • 小於等於100萬行:lists = rows / 1000probes = lists / 10

    • 大於100萬行:lists = sqrt(rows)probes = sqrt(lists)

      說明

      sqrt表示開方運算。