Dokumen ini menjelaskan cara menyesuaikan indeks untuk mencapai performa kueri yang lebih cepat dan perolehan yang lebih baik di AlloyDB Omni.
Sebelum memulai
Sebelum membuat indeks ScaNN, selesaikan langkah-langkah berikut:
- Pastikan tabel dengan data Anda sudah dibuat.
- Untuk menghindari masalah saat membuat indeks, pastikan nilai yang Anda tetapkan untuk flag
maintenance_work_memdanshared_bufferskurang dari total memori mesin. - Untuk menggunakan indeks empat tingkat, Anda harus mengaktifkan fitur Pratinjau untuk instance Anda terlebih dahulu. Untuk mengaktifkan fitur Pratinjau, pilih salah satu dari dua metode berikut:
- Aktifkan flag database
scann.enable_preview_features. - Tetapkan flag database
scann.max_allowed_num_levelstingkat sesi ke3.sql SET scann.max_allowed_num_levels = 3;
- Aktifkan flag database
Menyesuaikan indeks ScaNN
Gunakan panduan berikut untuk menentukan jumlah tingkat yang diperlukan untuk indeks ScaNN Anda:
- Untuk 0 hingga 10 juta baris: Pilih indeks dua tingkat.
- Untuk 10 juta hingga 100 juta baris:
- Untuk memprioritaskan perolehan penelusuran, pilih indeks dua tingkat.
- Untuk memprioritaskan waktu pembuatan indeks, pilih indeks tiga tingkat.
- Untuk 100 juta hingga 1 miliar baris:
- Untuk memprioritaskan perolehan penelusuran, pilih indeks tiga tingkat.
- Untuk memprioritaskan waktu pembuatan indeks, pilih indeks empat tingkat (dalam Pratinjau).
- Untuk 1 miliar hingga 10 miliar baris: Pilih indeks empat tingkat (dalam Pratinjau).
Pertimbangkan contoh berikut untuk indeks ScaNN dua tingkat, tiga tingkat, dan empat tingkat yang menunjukkan cara parameter penyesuaian ditetapkan untuk tabel dengan 1.000.000 baris:
Indeks dua tingkat
SET LOCAL scann.num_leaves_to_search = 1;
SET LOCAL scann.pre_reordering_num_neighbors=50;
CREATE INDEX my-scann-index ON my-table
USING scann (vector_column cosine)
WITH (num_leaves = [power(1000000, 1/2)]);
Indeks tiga tingkat
SET LOCAL scann.num_leaves_to_search = 10;
SET LOCAL scann.pre_reordering_num_neighbors=50;
CREATE INDEX my-scann-index ON my-table
USING scann (vector_column cosine)
WITH (num_leaves = [power(1000000, 2/3)], max_num_levels = 2);
Indeks empat tingkat
(dalam Pratinjau)
SET LOCAL scann.num_leaves_to_search = 100;
SET LOCAL scann.pre_reordering_num_neighbors=50;
CREATE INDEX my-scann-index ON my-table
USING scann (vector_column cosine)
WITH (num_leaves = [power(1000000, 3/4)], max_num_levels = 3);
Menangani pembatalan DML karena akselerasi dengan columnar engine
Jika Anda memilih untuk mempercepat penelusuran vektor dengan columnar engine, perlu diketahui bahwa pembatalan DML dan DDL pada tabel dasar dapat memengaruhi performa kueri vektor. Jika throughput DML tinggi, pertimbangkan untuk menyesuaikan flag database google_columnar_engine.refresh_threshold_percentage atau memperbarui indeks secara manual menggunakan perintah google_columnar_engine_refresh_index.
Menganalisis kueri Anda
Gunakan perintah EXPLAIN ANALYZE untuk menganalisis insight kueri Anda seperti yang ditunjukkan dalam contoh kueri SQL berikut.
EXPLAIN ANALYZE SELECT result-column
FROM my-table
ORDER BY EMBEDDING_COLUMN <-> embedding('text-embedding-005', 'What is a database?')::vector
LIMIT 1;
Respons contoh QUERY PLAN mencakup informasi seperti waktu yang diperlukan, jumlah baris yang dipindai atau ditampilkan, dan resource yang digunakan.
Limit (cost=0.42..15.27 rows=1 width=32) (actual time=0.106..0.132 rows=1 loops=1)
-> Index Scan using my-scann-index on my-table (cost=0.42..858027.93 rows=100000 width=32) (actual time=0.105..0.129 rows=1 loops=1)
Order By: (embedding_column <-> embedding('text-embedding-005', 'What is a database?')::vector(768))
Limit value: 1
Planning Time: 0.354 ms
Execution Time: 0.141 ms
Melihat metrik indeks vektor
Anda dapat menggunakan metrik indeks vektor untuk meninjau performa indeks vektor, mengidentifikasi area yang perlu ditingkatkan, dan menyesuaikan indeks berdasarkan metrik, jika diperlukan.
Untuk melihat semua metrik indeks vektor, jalankan kueri SQL berikut, yang menggunakan tampilan pg_stat_ann_indexes:
SELECT * FROM pg_stat_ann_indexes;
Anda akan melihat output yang mirip dengan berikut ini:
-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid | 271236
indexrelid | 271242
schemaname | public
relname | t1
indexrelname | t1_ix1
indextype | scann
indexconfig | {num_leaves=100,max_num_levels=1,quantizer=SQ8}
indexsize | 832 kB
indexscan | 0
insertcount | 250
deletecount | 0
updatecount | 0
partitioncount | 100
distribution | {"average": 3.54, "maximum": 37, "minimum": 0, "outliers": [37, 12, 11, 10, 10, 9, 9, 9, 9, 9]}
distributionpercentile |{"10": { "num_vectors": 0, "num_partitions": 0 }, "25": { "num_vectors": 0, "num_partitions": 30 }, "50": { "num_vectors": 3, "num_partitions": 30 }, "75": { "num_vectors": 5, "num_partitions": 19 }, "90": { "num_vectors": 7, "num_partitions": 11 }, "95": { "num_vectors": 9, "num_partitions": 5 }, "99": { "num_vectors": 12, "num_partitions": 4 }, "100": { "num_vectors": 37, "num_partitions": 1 }}
Untuk melihat jumlah baris yang dibuat pada saat pembuatan indeks, jalankan perintah berikut:
SELECT * FROM pg_stat_ann_index_creation;
Anda akan melihat output yang mirip dengan berikut ini:
-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid | 271236
indexrelid | 271242
schemaname | public
relname | t1
indexrelname | t1_ix1
index_rows_at_creation_time | 262144
Untuk mengetahui informasi selengkapnya tentang daftar lengkap metrik, lihat Metrik indeks vektor.
Langkah berikutnya
- Membuat indeks ScaNN
- Praktik terbaik untuk menyesuaikan indeks ScaNN
- Lihat contoh alur kerja embedding.