すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:IVF インデックスに基づく pgvector 拡張機能のパフォーマンス テスト

最終更新日:Mar 07, 2025

このトピックでは、pgvector 拡張機能を使用して、反転ファイル (IVF) インデックスに基づく ApsaraDB RDS for PostgreSQL インスタンスのパフォーマンスをテストする方法について説明します。 pgvector 拡張機能は、pgbench ツールを使用して、さまざまなデータ量におけるベクトルデータとインデックスが占めるストレージを評価し、lists パラメーターと probes パラメーターのさまざまな設定がクエリ効率と再現率に与える影響を分析します。

テスト環境

RDS インスタンスと Elastic Compute Service (ECS) インスタンスは、ネットワークの変動によるエラーを防ぐために、同じ仮想プライベートクラウド (VPC) 内に存在し、同じ vSwitch に属している必要があります。

テストインスタンスとテストツール

説明

RDS インスタンスの仕様

  • RDS インスタンスは PostgreSQL 16 を実行しています。

  • RDS インスタンスは、RDS High-availability Edition を実行し、pg.x8.2xlarge.2c 専用インスタンスタイプを使用する標準 RDS インスタンスです。このインスタンスタイプは、16 コアと 128 GB のメモリを提供します。

  • pgvector 拡張機能はバージョン 0.8.0 を実行しています。

ECS インスタンスの仕様

  • ECS インスタンスは、4 コアと 8 GiB のメモリを提供する ecs.c6.xlarge インスタンスタイプを使用します。

  • ECS インスタンスは Alibaba Cloud Linux 3 を実行しています。

  • PostgreSQL クライアントはバージョン 15.1 を実行しています。

テストツール

pgbench

準備

  1. testuser という名前の特権アカウントと testdb という名前のデータベースを作成します。詳細については、「データベースとアカウントを作成する」をご参照ください。

  2. testdb データベースに pgvector 拡張機能をインストールします。 pgvector 拡張機能は、システムでは vector という名前です。詳細については、「拡張機能を管理する」をご参照ください。

  3. 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;
  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 インスタンスの内部エンドポイントを使用することをお勧めします。この例では、テストは RDS インスタンスと同じリージョンおよび 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 を使用してストレステストを実行します。

    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 が接続されています。

テスト結果

データ量と、ベクトルとインデックスが個別に占めるストレージ、レイテンシ、および 1 秒あたりのトランザクション数 (TPS) の間のテスト結果

データ量 (単位: 10,000 行)

テーブルサイズ (単位: MB)

インデックスサイズ (単位: MB)

レイテンシ (単位: ミリ秒)

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

probes パラメーターの値を調整し、lists パラメーターの値を保持した場合のクエリ効率と再現率への影響

lists パラメーターの値が 2000 に固定されており、テーブルに 100 万行のデータが含まれているとします。この場合、probes パラメーターの値が大きいほど、再現率は高くなりますが、TPS は低くなります。

image..png

lists パラメーターの値を調整し、probes パラメーターの値を保持した場合のクエリ効率と再現率への影響

probes パラメーターの値が 20 に固定されており、テーブルに 100 万行のデータが含まれているとします。この場合、lists パラメーターの値が大きいほど、再現率は低くなりますが、TPS は高くなります。

image..png

結論

  • lists パラメーターの値は、インデックスが占めるストレージにわずかな影響を与えます。占有ストレージは、テーブル内のデータ量の影響を受けます。

  • lists パラメーターと probes パラメーターの値は、クエリ効率と再現率に反対の影響を与えます。クエリ効率と再現率のバランスをとるために、パラメーターに適切な値を指定する必要があります。

    image..png

    テーブル内のデータ行数に基づいて lists パラメーターと probes パラメーターを設定することをお勧めします。次のセクションでは、設定例を示します。

    • テーブル内のデータ行数が 100 万行以下の場合、次の式を使用して lists パラメーターと probes パラメーターの値を計算できます: lists = データ行数/1,000 および probes = lists パラメーターの値/10

    • テーブル内のデータ行数が 100 万行を超える場合、次の式を使用して lists パラメーターと probes パラメーターの値を計算できます: lists = sqrt(データ行数) および probes = sqrt(lists パラメーターの値)

      説明

      sqrt は平方根関数を示します。