Menyimpan indeks dalam cache di columnar engine akan menayangkan kueri langsung dari representasi indeks dalam memori yang dioptimalkan untuk baca, dan meningkatkan jumlah kueri per detik (QPS) yang dapat ditangani database Anda untuk workload penelusuran vektor.
Anda hanya dapat menggunakan HNSW dengan columnar engine untuk cluster AlloyDB Omni yang menjalankan PostgreSQL 17 atau yang lebih baru. ScaNN dengan columnar engine tidak memiliki batasan tersebut.
Sebelum memulai
Tetapkan flag database
google_columnar_engine.enableddangoogle_columnar_engine.enable_index_cachingkeonuntuk mengaktifkan columnar engine dan fitur penyimpanan indeks dalam cache.Untuk menetapkan flag database, jalankan perintah PostgreSQL
ALTER SYSTEM:ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_index_caching = 'on';Agar perubahan parameter konfigurasi diterapkan, mulai ulang container yang berjalan dengan AlloyDB Omni:
Docker
sudo docker restart CONTAINER_NAME ```* { Podman }```posix-terminal sudo podman restart CONTAINER_NAME ```For more information on setting flags, see Configure database flags.
Create a ScaNN index or Create an HNSW index in your database.
Add an index to the columnar engine
After enabling the columnar engine, you can add an existing index to the
cache using the google_columnar_engine_add_index() SQL function.
To add an index to the columnar engine, run the following query:
SELECT google_columnar_engine_add_index('INDEX_NAME');
Ganti INDEX_NAME dengan nama indeks vektor Anda.
Setelah Anda menambahkan indeks ke columnar engine, semua kueri yang menggunakan indeks ini akan otomatis dipercepat oleh columnar engine. Anda dapat memverifikasi bahwa kueri vektor dipercepat oleh columnar engine menggunakan rencana EXPLAIN (ANALYZE, COLUMNAR_ENGINE) pada kueri Anda.
Memverifikasi penggunaan cache
Untuk memverifikasi bahwa kueri vektor dipercepat oleh columnar engine, Anda dapat menggunakan rencana EXPLAIN (ANALYZE, COLUMNAR_ENGINE) pada kueri Anda.
Contoh rencana eksekusi ScaNN
Berikut adalah contoh rencana eksekusi untuk kueri yang menggunakan indeks ScaNN yang telah ditambahkan ke columnar engine:
EXPLAIN (ANALYZE TRUE, SCANN TRUE, COSTS FALSE, TIMING FALSE, SUMMARY FALSE, VERBOSE FALSE, COLUMNAR_ENGINE TRUE)
SELECT * FROM t ORDER BY val <=> '[0.5,0.5,0.5,0.5]' LIMIT 100;
--This contains details about ScaNN's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Index Scan using scann_idx on t t_1 (actual rows=100 loops=1)
Order By: (val <=> '[0.5,0.5,0.5,0.5]'::vector)
Limit: 100
ScaNN Info: (... columnar engine nodes hit=6...)
Columnar Engine ScaNN Info: (index found=true)
(5 rows)
Keberadaan columnar engine nodes hit dan Columnar Engine ScaNN Info:
(index found=true) dalam output mengonfirmasi bahwa columnar engine digunakan untuk
kueri.
Contoh rencana eksekusi HNSW
Rencana eksekusi menampilkan bagian Columnar Engine HNSW Info untuk indeks masing-masing yang menampilkan metrik seperti rasio elemen yang diambil dari columnar engine (elements_from_ce) dan dari disk (elements_from_disk).
Berikut adalah contoh rencana eksekusi untuk kueri yang menggunakan indeks HNSW yang telah ditambahkan ke columnar engine:
EXPLAIN (ANALYZE, COLUMNAR_ENGINE) SELECT * FROM documents ORDER BY embedding <=> '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector LIMIT 5;
--This contains details about HNSW's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
Limit (actual rows=5 loops=1)
-> Index Scan using hnsw_idx on documents (actual rows=5 loops=1)
Order By: (embedding '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector)
Columnar Engine HNSW Info: (index found=true elements_from_ce=385 elements_from_disk=0)
Columnar Check: table is not in the columnar store
(5 rows)
Respons menunjukkan bahwa indeks dipercepat oleh columnar engine, karena semua elemen diambil dari columnar engine (elements_from_ce=385) dan tidak ada yang diambil dari disk (elements_from_disk=0).
Saat modifikasi data seperti pernyataan INSERT, UPDATE, atau DELETE membatalkan entri cache, columnar engine menggunakan pendekatan hybrid untuk mempertahankan akurasi dan performa. Columnar engine membaca vektor yang valid dan di-cache langsung dari memori, dan hanya mengambil vektor yang diubah atau baru dari disk.
Jika Anda mengubah data dalam jumlah besar, Anda mungkin akan melihat peningkatan elements_from_disk dan penurunan performa untuk sementara hingga cache diupdate.
Mengelola indeks yang di-cache
Untuk mengelola siklus proses indeks yang di-cache, jalankan perintah SQL untuk tugas yang dipilih:
Untuk mengupdate cache secara manual, jalankan perintah berikut:
SELECT google_columnar_engine_refresh_index('INDEX_NAME');Untuk memverifikasi status indeks, jalankan perintah berikut:
SELECT google_columnar_engine_verify('INDEX_NAME');Untuk menghapus indeks dari cache, jalankan perintah berikut:
SELECT google_columnar_engine_drop_index('INDEX_NAME');Untuk melihat indeks aktif, jalankan perintah berikut:
SELECT * FROM g_columnar_indexes;Untuk melihat indeks yang dipartisi, jalankan perintah berikut:
SELECT * FROM g_columnar_index_partitions;
Ganti INDEX_NAME dengan nama indeks Anda.
Batasan
Mengupdate indeks HNSW yang dipercepat oleh columnar engine dapat menggunakan memori hingga dua kali ukuran indeks untuk sementara.
Langkah berikutnya
- Membuat indeks dan vektor kueri menggunakan ScaNN
- Ringkasan columnar engine
- Mengelola kolom secara manual
- Melakukan penelusuran vektor