本文介紹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表示開方運算。

