Tüm Ürünler
Search
Belge Merkezi

ApsaraDB RDS:Pgvector performance test (HNSW index)

Son Güncelleme:Oct 12, 2026

Bu konu, ApsaraDB RDS for PostgreSQL örneğinde HNSW dizinine sahip pgvector uzantısının performans kıyaslamasını sunar. Kıyaslama, hatırlama oranı, saniye başına sorgu sayısı (QPS) ve dizin oluşturma süresi gibi temel ölçümler açısından RDS uygulamasının topluluk sürümüne kıyasla performansını değerlendirmek için ann-benchmarks aracını kullanır.

Test ortamı

Ağ dalgalanmalarından kaynaklanan hataları önlemek için RDS PostgreSQL örneğiniz ile istemci ECS örneğinizi aynı Virtual Private Cloud (VPC) ve vSwitch içinde konumlandırın.

Bileşen

Açıklama

RDS PostgreSQL örneği

  • Ana sürüm: RDS PostgreSQL 17

  • Örnek türü: pg.x4.2xlarge.1

  • pgvector eklenti sürümü: 0.8.0.1

ECS örneği

  • Örnek türü: ecs.c6.xlarge (4 çekirdek, 8 GiB)

  • İşletim sistemi: Alibaba Cloud Linux 3

Test aracı

ANN-Benchmarks

Önemli

Varsayılan olarak ANN-Benchmarks tek iş parçacıklı performansı test eder. Örneğin eşzamanlı performansını test etmek için bkz. Pgvector performans testi (IVF dizini tabanlı).

Ön koşullar

RDS for PostgreSQL örneği

  1. ann_testuser adında yüksek ayrıcalıklı bir hesap ve ann_testdb adında bir test veritabanı oluşturun. Daha fazla bilgi için bkz. Hesaplar ve veritabanları oluşturun.

  2. ann_testdb veritabanında pgvector eklentisini (vector) yükleyin. Daha fazla bilgi için bkz. Eklentileri yönetin.

İstemci ECS örneği

  1. Docker'ı yükleyin. Daha fazla bilgi için bkz. Docker yükleyin.

  2. ann-benchmarks aracını indirmek için aşağıdaki komutları çalıştırın.

    cd ~
    git clone https://github.com/erikbern/ann-benchmarks.git
  3. Conda kullanarak ann_test adlı Python 3.10.6 sanal ortamı oluşturmak ve etkinleştirmek için aşağıdaki komutları çalıştırın.

    yum install git
    yum install conda
    conda create -n ann_test python=3.10.6
    conda init bash
    source /usr/etc/profile.d/conda.sh 
    conda activate ann_test
  4. ann-benchmarks bağımlılıklarını yüklemek için aşağıdaki komutları çalıştırın.

    cd ~/ann-benchmarks/
    pip install -r requirements.txt

Test yordamı

Önemli

Bu yordamdaki tüm adımlar ann_test sanal ortamında gerçekleştirilir. Oturum zaman aşımına uğrar veya herhangi bir nedenle sonlanırsa conda activate ann_test komutuyla ortama yeniden girin.

Adım 1: Bağlantı ayarlarını yapılandırın

Bağlantı ayarlarını eklemek için kıyaslama aracındaki ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/module.py dosyasını düzenleyin. Değerleri gerçek ortamınıza göre doldurun.

# Set the connection parameters for PostgreSQL
os.environ['ANN_BENCHMARKS_PG_USER'] = 'ann_testuser'     # The user for the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_PASSWORD'] = 'testPawword'  # The password for the RDS PostgreSQL user
os.environ['ANN_BENCHMARKS_PG_DBNAME'] = 'ann_testdb'     # The database name of the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_HOST'] = 'pgm-****.pg.rds.aliyuncs.com'  # The internal endpoint of the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_PORT'] = '5432'             # The internal port number of the RDS PostgreSQL instance
os.environ['ANN_BENCHMARKS_PG_START_SERVICE'] = 'false'   # Disable automatic service startup

Adım 2: ann-benchmarks test parametrelerini yapılandırın

Test gereksinimlerinize göre kıyaslama aracındaki ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/config.yml dosyasını düzenleyin. Örnek:

float:
  any:
  - base_args: ['@metric']
    constructor: PGVector
    disabled: false
    docker_tag: ann-benchmarks-pgvector
    module: ann_benchmarks.algorithms.pgvector
    name: pgvector
    run_groups:
      M-16(100):
        arg_groups: [{M: 16, efConstruction: 100}]
        args: {}
        query_args: [[10, 20, 40, 80, 120, 200, 400, 800]]
      M-16(200):
        arg_groups: [{M: 16, efConstruction: 200}]
        args: {}
        query_args: [[10, 20, 40, 80, 120, 200, 400, 800]]
      M-24(200):
        arg_groups: [{M: 24, efConstruction: 200}]
        args: {}
        query_args: [[10, 20, 40, 80, 120, 200, 400, 800]]                                                            

Bu test M-16(100), M-16(200) ve M-24(200) olmak üzere üç gruba ayrılmıştır. Her test grubu, HNSW dizini oluşturma parametrelerini yapılandırmak için arg_groups ve erişim parametrelerini yapılandırmak için query_args kullanır.

Parametre

Açıklama

arg_groups

M

HNSW dizinindeki m parametresine karşılık gelir. HNSW dizini oluşturulurken her katmandaki her düğüm için maksimum komşu sayısını belirtir.

Daha büyük bir değer grafiğin yoğunluğunu artırır; bu durum genellikle hatırlama oranını iyileştirir ancak dizin oluşturma ve sorgu süresini de uzatır.

efConstruction

HNSW dizinindeki ef_construction parametresine karşılık gelir. Dizin oluşturma sırasında aday kümesinin boyutunu belirtir; bu da en uygun bağlantıları seçerken kaç aday düğümün değerlendirileceğini belirler.

Daha büyük bir değer genellikle hatırlama oranını iyileştirir ancak dizin oluşturma ve sorgu süresini de uzatır.

query_args

ef_search

Arama işlemi sırasında korunan aday kümesinin boyutunu belirleyen sorgu zamanı ayarıdır.

Daha büyük bir değer genellikle hatırlama oranını iyileştirir ancak sorgu süresini de uzatır.

Adım 3: Test Docker görüntüsü oluşturun

  1. PostgreSQL topluluk sürümünün (varsayılan) test edilmesini atlamak için (isteğe bağlı) ~/ann-benchmarks/ann_benchmarks/algorithms/pgvector/Dockerfile dosyasını aşağıdaki gibi değiştirin:

    FROM ann-benchmarks
    USER root
    RUN pip install psycopg[binary] pgvector
  2. Test Docker görüntüsünü oluşturmak için --algorithm pgvector parametresiyle install.py betiğini çalıştırın.

    cd ~/ann-benchmarks/
    python install.py --algorithm pgvector
    Not

    Desteklenen parametreleri görüntülemek için python install.py --help komutunu çalıştırın.

Adım 4: Veri kümesini edinin

Kıyaslama betiği belirtilen genel veri kümesini otomatik olarak indirir.

Bu konuda metin benzerliği araması örneği olarak Angular mesafe türünü kullanan nytimes-256-angular veri kümesi kullanılmıştır. Diğer genel veri kümeleri için bkz. ann-benchmarks.


Veri Kümesi


Boyut


Satır Sayısı


Test Vektörleri


En İyi N Komşu


Mesafe Türü


NYTimes


256


290.000


10.000


100


Angular

Not

Genel veri kümesi test ihtiyaçlarınızı karşılamıyorsa, erişim performansını test etmek için gerçek vektör verilerinizi HDF5 gibi standart bir biçime dönüştürmenizi öneririz. Daha fazla bilgi için bkz. Ek II: Özel Test Veri Kümeleri.

Adım 5: Testi çalıştırın ve sonuçları alın

  1. Kıyaslama betiğini çalıştırmak için aşağıdaki komutları kullanın.

    cd ~/ann-benchmarks
    nohup python run.py --dataset nytimes-256-angular -k 10  --algorithm pgvector --runs 1 > ann_benchmark_test.log 2>&1 &
    tail -f ann_benchmark_test.log


    Parametre


    Açıklama


    --dataset


    Test edilecek veri kümesini belirtir.


    --k


    Sorgu SQL deyemindeki LIMIT değeri, döndürülecek sonuç sayısını belirtir.


    --algorithm


    Test edilecek vektör veritabanı algoritması. Bu test için pgvector olarak ayarlayın.


    --runs


    Test çalıştırma sayısı. Çalıştırmalar arasından en iyi sonuç seçilir.


    --parallelism


    Test eşzamanlılığı. Varsayılan değer 1'dir.

  2. Test sonuçlarının grafiğini oluşturmak için aşağıdaki komutu çalıştırın.

    cd ~/ann-benchmarks
    python plot.py --dataset nytimes-256-angular --recompute

    Dizin oluşturma ölçümlerine ve aynı hatırlama oranındaki performans kazançlarına odaklanın.

    Dizin oluşturma karşılaştırması:


    Dizin Türü


    Oluşturma Süresi (s)


    Dizin Boyutu


    HNSW topluluk sürümü (v0.8.0)


    127,89


    7820 MB


    HNSW RDS sürümü (v0.8.0.1)


    77,72


    3916 MB

    Aynı hatırlama oranında QPS karşılaştırması:


    Hatırlama Oranı


    v0.8.0 HNSW Parametreleri


    v0.8.0.1 HNSW Parametreleri


    v0.8.0 QPS


    v0.8.0.1 QPS


    %97


    ef_search=10


    ef_search=10


    1635,41


    1954,48


    %98


    ef_search=30


    ef_search=20


    1075,49


    1379,61


    %99,3


    ef_search=120


    ef_search=80


    434,74


    737,06


    %99,5


    ef_search=300


    ef_search=350


    200,06


    319,19


    %99,6


    ef_search=500


    ef_search=500


    109,51


    177,94

  3. Ayrıntılı test sonuçlarını bir CSV dosyasına aktarmak için (isteğe bağlı) aşağıdaki komutu çalıştırın.

    cd ~/ann-benchmarks
    python data_export.py --out res.csv

    Örneğin, m ve ef_construction parametreleri ile dizin oluşturma süresi arasındaki ilişkiyi analiz edebilirsiniz:


    m


    ef_construction


    Oluşturma Süresi (s)


    16


    100


    33,35161


    16


    200


    57,66014


    24


    200


    87,22608

Sonuçlar

HNSW dizini oluştururken:

  • m, ef_construction ve ef_search değerlerini artırmak hatırlama oranını iyileştirebilir ancak QPS'yi düşürür.

  • m ve ef_construction değerlerini artırmak hatırlama oranını yükseltirken QPS'yi düşürür ve dizin oluşturma süresini uzatır.

  • Uygulamanız yüksek bir hatırlama oranı gerektiriyorsa varsayılan dizin parametrelerinden (m=16, ef_construction=64 ve ef_search=40) kaçının.

Ek I: RDS for PostgreSQL: Dizinin oluşturulması üzerindeki parametre etkisi

Bu ek, çeşitli RDS for PostgreSQL ve vektör parametrelerinin dizin oluşturma üzerindeki etkisini göstermek için ann-benchmarks test sonuçlarını kullanır.

RDS for PostgreSQL: Dizinin oluşturulması üzerindeki parametre etkisi

Örneğin, ann-benchmarks test parametreleri m=16 ve efConstruction=64 olarak ayarlandığında RDS for PostgreSQL parametreleri dizin oluşturmayı aşağıdaki şekilde etkiler.

  • maintenance_work_mem

    Bu parametre, VACUUM ve CREATE INDEX gibi bakım işlemleri için kilobayt (KB) cinsinden maksimum belleği belirtir. **maintenance_work_mem değeri veri kümesi boyutundan küçük olduğunda değeri artırmak dizin oluşturma süresini azaltır. Ancak değer veri kümesi boyutunu aştığında oluşturma süresi artık azalmaz.**

    Örneğin, pg.x8.2xlarge.2c türündeki (16 çekirdek, 128 GB) bir RDS for PostgreSQL örneğinde max_parallel_maintenance_workers parametresi varsayılan değeri olan 8'e ayarlandığında ve yaklaşık 324 MB boyutundaki nytimes-256-angular veri kümesi kullanıldığında maintenance_work_mem parametresi dizin oluşturmayı aşağıdaki şekilde etkiler:


    maintenance_work_mem


    Dizin Oluşturma Süresi (s)


    64 MB (65536 KB)


    52,82


    128 MB (131072 KB)


    46,79


    256 MB (262144 KB)


    36,40


    512 MB (524288 KB)


    18,90


    1 GB (1048576 KB)


    19,06

  • max_parallel_maintenance_workers

    Bu parametre CREATE INDEX için maksimum paralel çalışan sayısını ayarlar. **max_parallel_maintenance_workers değeri arttıkça dizin oluşturma süresi azalır.**

    Örneğin, pg.x8.2xlarge.2c türündeki (16 çekirdek, 128 GB) bir RDS for PostgreSQL örneğinde maintenance_work_mem parametresi 2 GB'a (2048 MB) ayarlandığında ve yaklaşık 324 MB boyutundaki nytimes-256-angular veri kümesi kullanıldığında max_parallel_maintenance_workers parametresi dizin oluşturmayı aşağıdaki şekilde etkiler:


    max_parallel_maintenance_workers


    Dizin Oluşturma Süresi (s)


    1


    76,00


    2


    51,34


    4


    32,49


    8


    19,66


    12


    14,44


    16


    13,07


    24


    13,15

Dizin oluşturma üzerindeki vektör parametresi etkisi

RDS for PostgreSQL parametreleri maintenance_work_mem=8 GB (8388608 KB) ve max_parallel_maintenance_workers=16 olarak ayarlandığında vektör parametrelerinin dizin oluşturma üzerindeki etkisi aşağıdaki bölümlerde gösterilmiştir.

  • Vektör boyutu

    Aşağıdaki testler GloVe veri kümesini (1.183.514 vektör) kullanır ve ann-benchmarks test parametreleri m=16, efConstruction=64 ve ef_search=40 olarak ayarlanır. Sonuçlar, vektör boyutu arttıkça dizin oluşturma süresi ve sorgu gecikme süresinin de arttığını, hatırlama oranı ve QPS'nin ise azaldığını göstermektedir.


    Boyut


    Oluşturma Süresi (s)


    Hatırlama Oranı


    QPS


    p99 (ms)


    25


    195,10


    0,99985


    192,94


    7,84


    50


    236,92


    0,99647


    152,36


    9,69


    100


    319,36


    0,97231


    126,89


    11,14


    200


    529,33


    0,93186


    95,05


    15,11

    Not

    Sorgu gecikme süresinin yüzde 99'luk dilimi. Sorgu isteklerinin %99'unun bu değerden daha kısa sürede tamamlandığı, yalnızca %1'inin ise daha uzun sürdüğü anlamına gelir.

  • Vektör sayısı

    Bu testler dbpedia-openai-{n}k-angular veri kümesi serisini kullanır; burada n bin cinsinden vektör sayısını (100'den 1.000'e) temsil eder. Ann-benchmarks test parametreleri m=48, efConstruction=256 ve ef_search=200 olarak ayarlandığında test sonuçları aşağıdaki gibidir. Sonuçlar, vektör sayısı arttıkça dizin oluşturma süresinin doğrusal olmayan bir şekilde arttığını, hatırlama oranı ve QPS'nin azaldığını ve sorgu gecikme süresinin ise arttığını göstermektedir.


    Vektör Sayısı


    Satır Sayısı (x10.000)


    Oluşturma Süresi (s)


    Hatırlama Oranı


    QPS


    p99 (ms)


    100


    10


    54,05


    0,9993


    171,74


    8,93


    200


    20


    137,23


    0,99901


    146,78


    10,81


    500


    50


    436,68


    0,999


    118,55


    13,94


    1000


    100


    957,26


    0,99879


    101,60


    16,35

Ek II: Özel test veri kümesi

Aşağıdaki örnek, nytimes-256-angular veri biçimine dayalı bir veri kümesinin nasıl oluşturulacağını gösterir.

  1. Özel bir test veri kümesi oluşturmak için aşağıdaki betiği çalıştırın.

    Not

    Bu örnek rds_ai uzantısını gerektirir. Daha fazla bilgi için bkz. AI (rds_ai).

    import h5py
    import numpy as np
    import psycopg2
    import pgvector.psycopg2
    
    # Connection details
    conn_info = {
        'host': 'pgm-****.rds.aliyuncs.com',
        'user': 'ann_testuser',
        'password': '****',
        'port': '5432',
        'dbname': 'ann_testdb'
    }
    
    embedding_len = 1024
    distance_top_n = 100
    query_batch_size = 100
    
    try:
        # Connect to the RDS for PostgreSQL database
        with psycopg2.connect(**conn_info) as connection:
            pgvector.psycopg2.register_vector(connection)
            with connection.cursor() as cur:
                # Fetch the vector data
                cur.execute("select count(1) from test_rag")
                count = cur.fetchone()[0]
    
                train_embeddings = []
                for start in range(0, count, query_batch_size):
                    query = f"SELECT embedding FROM test_rag ORDER BY id OFFSET {start} LIMIT {query_batch_size}"
                    cur.execute(query)
                    res = [embedding[0] for embedding in cur.fetchall()]
                    train_embeddings.extend(res)
                train = np.array(train_embeddings)
    
                # Get query data and compute embeddings
                with open('query.txt', 'r', encoding='utf-8') as file:
                    queries = [query.strip() for query in file]
                test = []
                # Install the rds_ai extension or use the Alibaba Cloud Model Studio SDK
                for query in queries:
                    cur.execute(f"SELECT rds_ai.embed('{query.strip()}')::vector(1024)")
                    test.extend([cur.fetchone()[0]])
                test = np.array(test)
    
        # Calculate the top N nearest neighbor distances
        dot_product = np.dot(test, train.T)
        norm_test = np.linalg.norm(test, axis=1, keepdims=True)
        norm_train = np.linalg.norm(train, axis=1, keepdims=True)
        similarity = dot_product / (norm_test * norm_train.T)
        distance_matrix = 1 - similarity
    
        neighbors = np.argsort(distance_matrix, axis=1)[:, :distance_top_n]
        distances = np.take_along_axis(distance_matrix, neighbors, axis=1)
    
        with h5py.File('custom_dataset.hdf5', 'w') as f:
            f.create_dataset('distances', data=distances)
            f.create_dataset('neighbors', data=neighbors)
            f.create_dataset('test', data=test)
            f.create_dataset('train', data=train)
            f.attrs.update({
                "type": "dense",
                "distance": "angular",
                "dimension": embedding_len,
                "point_type": "float"
            })
    
        print("The HDF5 file was created successfully and the dataset was added.")
    
    except (Exception, psycopg2.DatabaseError) as error:
        print(f"Error: {error}")
    
  2. Özel test veri kümenizi DATASETS bölümünde ~/ann-benchmarks/ann_benchmarks/datasets.py dosyasına kaydedin.

    DATASETS: Dict[str, Callable[[str], None]] = {
      ......,
      "<custom_dataset>": None,
    }
  3. Özel test veri kümesini ~/ann-benchmarks dizinine yükleyin. Ardından veri kümesini run.py test betiğiyle kullanabilirsiniz.