Bu belgede, ApsaraDB RDS for PostgreSQL üzerinde IVFFlat dizinleri için kıyaslama sonuçları sunulmaktadır. Veri hacminin depolamayı nasıl etkilediğini ve iş yükünüz için ayarlama yapmadan önce sorgu aktarım hızı ile geri çağırma oranı arasındaki dengeyi lists ve probes parametrelerinin nasıl belirlediğini anlamak için bu sonuçlardan yararlanın.
IVFFlat dizinlerinin çalışma mantığı
IVFFlat, dizin oluşturma sırasında vektörleri kümeler halinde böler. Sorgu sırasında veritabanı, tüm vektörler yerine yalnızca bir alt kümeyi arar.
| Parametre | Rolü | Daha yüksek değerin etkisi |
|---|---|---|
lists |
Dizin oluşturma sırasında oluşturulan küme sayısı | Daha hızlı sorgular (küme başına daha az vektör), ancak sorgu vektörleri küme sınırlarına yakın olduğunda daha düşük geri çağırma oranı |
probes |
Sorgu sırasında aranan küme sayısı | Daha yüksek geri çağırma oranı, ancak daha yavaş sorgular |
İki parametrenin geri çağırma oranı ve aktarım hızı üzerindeki etkileri birbirine zıttır.
Test ortamı
Test sonuçlarında ağ kaynaklı değişkenliği önlemek için RDS örneği ve ECS örneği aynı sanal özel bulut (VPC) ve vSwitch içinde bulunmalıdır.
| Bileşen | Teknik Özellikler |
|---|---|
| RDS örneği | PostgreSQL 16, RDS Yüksek Kullanılabilirlik Sürümü, pg.x8.2xlarge.2c özel örnek (16 çekirdek, 128 GB bellek) |
| pgvector sürümü | 0.8.0 |
| ECS örneği | ecs.c6.xlarge (4 çekirdek, 8 GiB bellek), Alibaba Cloud Linux 3 |
| PostgreSQL istemcisi | 15,1 |
| Test aracı | pgbench |
Ön koşullar
Başlamadan önce aşağıdaki gereksinimleri karşıladığınızdan emin olun:
testuseradlı yetkili bir hesap vetestdbadlı bir veritabanı. Bkz. Veritabanı ve hesap oluşturmapgvector uzantısının
testdbveritabanında yüklü olması. Sistemde uzantının adıvectorolarak geçer. Bkz. Uzantıları yönetmeRDS örneğine bağlantı kurulmuş olması. Bkz. ApsaraDB RDS for PostgreSQL örneğine bağlanma
Test verilerini hazırlama
-
testdbveritabanına bağlanın ve belirli bir uzunlukta rastgele vektörler üreten bir yardımcı işlev oluşturun: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 boyutlu vektörler için bir tablo oluşturun:
CREATE TABLE vtest(id BIGINT, v VECTOR(1536)); -
100.000 satırlık test verisi ekleyin:
INSERT INTO vtest SELECT i, random_array(1536)::VECTOR(1536) FROM generate_series(1, 100000) AS i; -
100 liste kullanarak kosinüs mesafesi ile bir IVFFlat dizini oluşturun:
CREATE INDEX ON vtest USING ivfflat(v vector_cosine_ops) WITH(lists = 100);
Kıyaslamayı çalıştırma
Ağ gecikme süresini bir değişken olarak ortadan kaldırmak için RDS örneğinin dahili uç noktasını kullanın.
-
Aşağıdaki sorguyu içeren
test.sqladlı bir SQL dosyası oluşturun. Bu sorgu, rastgele bir 1536 boyutlu vektör üretir ve kosinüs mesafesini kullanarakvtesttablosundan en benzer kayıtları getirir: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); -
ECS örneğinden pgbench komutunu çalıştırın. PostgreSQL istemcisini yüklediğinizden emin olun. Referans için pgbench belgelerine bakın.
pgbench -f ./test.sql -c6 -T60 -P5 -U testuser -h pgm-bp****.pg.rds.aliyuncs.com -p 5432 -d testdbParametre Açıklama -f ./test.sqlTest SQL dosyasının yolu. Gerçek yol ile değiştirin -c6Eşzamanlı istemci bağlantısı sayısı (bu testte 6) -T60Test süresi saniye cinsinden (bu testte 60 saniye) -P5İlerleme raporu aralığı saniye cinsinden (her 5 saniyede bir) -U testuserVeritabanı kullanıcı adı. Kendi kullanıcı adınızla değiştirin -h pgm-bp****.pg.rds.aliyuncs.comRDS örneğinin dahili uç noktası -p 5432RDS örneğinin dahili bağlantı noktası -d testdbHedef veritabanı
Test sonuçları
Üretim ortamı için lists ve probes değerlerini ayarlama
Aşağıdaki grafik, her iki parametre değiştiğinde geri çağırma oranı ve aktarım hızı arasındaki bileşik dengeyi göstermektedir.

Tablonuzdaki satır sayısına bağlı olarak başlangıç noktası olarak aşağıdaki formülleri kullanın:
1.000.000 satıra kadar:
lists = row_count / 1,000
probes = lists / 10
1.000.000 satırdan fazla:
lists = sqrt(row_count)
probes = sqrt(lists)
sqrt karekök işlevidir. Formülleri uyguladıktan sonra, geri çağırma oranı yetersizse probes değerini yukarı doğru, aktarım hızını artırmak için ise aşağı doğru ayarlayın.

