このトピックでは、pgvector 拡張機能を使用して、反転ファイル (IVF) インデックスに基づく ApsaraDB RDS for PostgreSQL インスタンスのパフォーマンスをテストする方法について説明します。 pgvector 拡張機能は、pgbench ツールを使用して、さまざまなデータ量におけるベクトルデータとインデックスが占めるストレージを評価し、lists パラメーターと probes パラメーターのさまざまな設定がクエリ効率と再現率に与える影響を分析します。
テスト環境
RDS インスタンスと Elastic Compute Service (ECS) インスタンスは、ネットワークの変動によるエラーを防ぐために、同じ仮想プライベートクラウド (VPC) 内に存在し、同じ vSwitch に属している必要があります。
テストインスタンスとテストツール | 説明 |
RDS インスタンスの仕様 |
|
ECS インスタンスの仕様 |
|
テストツール | pgbench |
準備
testuser という名前の特権アカウントと testdb という名前のデータベースを作成します。詳細については、「データベースとアカウントを作成する」をご参照ください。
testdb データベースに pgvector 拡張機能をインストールします。 pgvector 拡張機能は、システムでは vector という名前です。詳細については、「拡張機能を管理する」をご参照ください。
RDS インスタンスに接続し、テストデータとして testdb データベースに固定長のランダムベクトルを生成します。詳細については、「ApsaraDB RDS for PostgreSQL インスタンスに接続する」をご参照ください。
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 インスタンスの内部エンドポイントを使用することをお勧めします。この例では、テストは RDS インスタンスと同じリージョンおよび 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 を使用してストレステストを実行します。
pgbench は、PostgreSQL でベンチマークテストを実行するプログラムです。 CLI で次のコマンドを実行する必要があります。この場合、PostgreSQL クライアントがインストールされていることを確認してください。この例では、PostgreSQL 15.1 が使用されています。詳細については、「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 インスタンスの内部エンドポイント。
-p 5432
RDS インスタンスの内部ポート。
-d testdb
接続するデータベース。この例では、testdb が接続されています。
テスト結果
結論
lists パラメーターの値は、インデックスが占めるストレージにわずかな影響を与えます。占有ストレージは、テーブル内のデータ量の影響を受けます。
lists パラメーターと probes パラメーターの値は、クエリ効率と再現率に反対の影響を与えます。クエリ効率と再現率のバランスをとるために、パラメーターに適切な値を指定する必要があります。

テーブル内のデータ行数に基づいて lists パラメーターと probes パラメーターを設定することをお勧めします。次のセクションでは、設定例を示します。
テーブル内のデータ行数が 100 万行以下の場合、次の式を使用して lists パラメーターと probes パラメーターの値を計算できます:
lists = データ行数/1,000およびprobes = lists パラメーターの値/10テーブル内のデータ行数が 100 万行を超える場合、次の式を使用して lists パラメーターと probes パラメーターの値を計算できます:
lists = sqrt(データ行数)およびprobes = sqrt(lists パラメーターの値)。説明sqrt は平方根関数を示します。

