Dokumen ini memberikan rekomendasi untuk mengoptimalkan performa penelusuran vektor di Spanner.
Memahami dasar-dasar Spanner
Untuk melakukan pengujian performa penelusuran vektor Spanner yang efektif, pahami dasar-dasar Spanner. Misalnya, menjalankan kembali kueri yang sama secara langsung dapat lebih cepat karena adanya cache. Untuk menguji performa pada aplikasi yang terutama menggunakan data hangat, lakukan pembacaan pemanasan terlebih dahulu.
Lihat panduan berikut:
- Ringkasan performa
- Praktik terbaik SQL
- Melakukan penelusuran K-nearest neighbors (KNN)
- Melakukan penelusuran perkiraan tetangga terdekat (ANN) dengan indeks vektor
- Praktik terbaik pengindeksan vektor
Spanner memproses kueri secara paralel berdasarkan pemisahan database. Pengujian dengan beban kueri produksi yang berkelanjutan dapat mengaktifkan pemisahan berbasis beban, yang meningkatkan performa kueri melalui peningkatan paralelisme. Untuk meningkatkan paralelisme untuk beban mendatang, pertimbangkan untuk membagi terlebih dahulu database Anda, terutama untuk KNN.
Praktik terbaik penelusuran vektor
Dokumen ini menjelaskan praktik terbaik penelusuran vektor berikut:
- Anotasikan kolom penyematan
- Menggunakan kueri top-k
- Menggunakan literal SQL untuk klausa
LIMIT - Menggunakan pemindaian berorientasi batch
- Menggunakan KNN untuk set data kecil
- Menggunakan ANN untuk set data besar
Menganotasi kolom penyematan
Anotasikan kolom penyematan dengan
vector_length.
Anotasi ini memungkinkan pengoptimalan performa untuk penelusuran K-nearest neighbor (KNN) dan merupakan prasyarat untuk penelusuran approximate nearest neighbor (ANN).
Menggunakan kueri top-k
Untuk menemukan tetangga terdekat, gunakan klausa ORDER BY dengan LIMIT. Kueri top-k
sangat dioptimalkan untuk penelusuran vektor. Hindari pemfilteran menurut nilai minimum jarak dalam klausa WHERE.
Misalnya, hal berikut tidak direkomendasikan:
SELECT d.DocId
FROM Documents AS d
WHERE COSINE_DISTANCE(d.DocEmbedding, @vector) < 1;
Sebagai gantinya, gunakan:
SELECT d.DocId
FROM Documents AS d
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;
Penggunaan kueri top-k tidak hanya lebih sederhana karena menghilangkan penyesuaian nilai minimum jarak, tetapi juga memungkinkan pengoptimalan performa yang dikhususkan untuk penelusuran vektor.
Menggunakan literal SQL untuk klausa LIMIT
Jika batas top-k tetap, gunakan literal SQL, bukan parameter. Misalnya, gunakan LIMIT 10, bukan LIMIT @limit. Hal ini memberikan lebih banyak informasi kepada
pengoptimal kueri
Spanner untuk memilih
rencana eksekusi kueri terbaik.
Menggunakan pemindaian berorientasi batch
Kueri penelusuran vektor sangat intensif dalam pemindaian. Untuk kueri KNN, pertimbangkan untuk menggunakan pemindaian berorientasi batch dengan
petunjuk kueri scan_method=batch.
Ini adalah metode pemindaian default untuk kueri ANN.
Menggunakan KNN untuk set data kecil
Jika KNN sudah cukup untuk anggaran latensi Anda, jangan buat indeks vektor. KNN lebih akurat, menghindari biaya pembuatan dan pemeliharaan indeks, serta dapat berperforma lebih baik daripada ANN jika jumlah baris input setelah pemfilteran apa pun kecil.
Mempercepat KNN yang difilter dengan indeks sekunder
Untuk meningkatkan performa kueri KNN yang difilter, buat indeks sekunder pada kolom pemfilteran. Misalnya, pertimbangkan kueri berikut:
SELECT d.DocId
FROM Documents AS d
WHERE Category = 'toy'
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;
Jika jumlah dokumen per kategori kurang dari beberapa puluh ribu dan aplikasi Anda dapat menerima latensi kueri 100 md, buat indeks sekunder pada kolom Category. Simpan kolom DocEmbedding dalam indeks:
CREATE INDEX ON Documents(Category) STORING (DocEmbedding);
Pembuatan indeks ini membantu mempercepat kueri yang difilter.
Menggunakan ANN untuk set data besar
Jika jumlah baris besar setelah dievaluasi untuk filter, buat indeks vektor dan gunakan penelusuran ANN. Beberapa teknik dapat mempercepat pemfilteran dengan ANN:
Menyimpan kolom pemfilteran: Untuk mengaktifkan pemfilteran saat menjelajahi penelusuran vektor, simpan kolom pemfilteran dalam indeks vektor. Hal ini memungkinkan baris yang tidak memenuhi syarat dihapus lebih awal dalam eksekusi.
CREATE VECTOR INDEX ON Documents(DocEmbedding) STORING(Category);Kolom pemfilteran utama: Untuk mempercepat pemfilteran untuk kolom yang sangat selektif yang menghapus banyak hasil, atur kolom ini sebagai kolom utama tambahan dalam indeks vektor. Kueri yang menentukan persamaan persis (menggunakan operator
=) untuk kunci tambahan ini akan dipercepat paling banyak. Menggunakan klausaINuntuk salah satu kunci tambahan ini tidak akan mencapai tingkat akselerasi yang sama.CREATE VECTOR INDEX ON Documents(DocEmbedding, Category);Hindari menyimpan kolom besar atau menggunakannya sebagai kunci: Tindakan ini dapat mengurangi kualitas blok data untuk penyematan, yang dapat mengurangi efisiensi pembacaan. Sebagai alternatif, pertimbangkan untuk menggunakan kolom hash dalam indeks, dan gunakan kolom besar asli sebagai filter pasca-k teratas.
Buat indeks vektor yang difilter (parsial):Jika Anda hanya membuat kueri subset set data, dan kondisi pemfilteran menentukan subset tersebut, seperti
Category = "Tech", buat indeks vektor yang difilter atau parsial.