Mempercepat penelusuran vektor dengan columnar engine

Anda dapat menggunakan columnar engine AlloyDB for PostgreSQL untuk mempercepat penelusuran vektor saat menggunakan indeks Scalable Nearest Neighbors (ScaNN) atau Hierarchical Navigable Small World (HNSW). Mesin columnar bertindak sebagai cache dalam memori yang dioptimalkan untuk baca bagi indeks vektor ini.

Meng-cache indeks di mesin berbasis kolom akan menayangkan kueri secara langsung dari representasi indeks dalam memori yang dioptimalkan untuk baca, dan meningkatkan jumlah kueri per detik (QPS) yang dapat ditangani database Anda untuk beban kerja penelusuran vektor.

Anda hanya dapat menggunakan HNSW dengan mesin columnar untuk cluster AlloyDB yang menjalankan PostgreSQL 17 atau yang lebih baru. ScaNN dengan mesin columnar tidak memiliki batasan tersebut.

Sebelum memulai

  • Tetapkan flag database google_columnar_engine.enabled dan google_columnar_engine.enable_index_caching ke on untuk mengaktifkan columnar engine dan fitur caching indeksnya.

    gcloud alloydb instances update INSTANCE_ID \
        --database-flags google_columnar_engine.enabled=on,google_columnar_engine.enable_index_caching=on \
        --region=REGION \
        --cluster=CLUSTER_ID \
        --project=PROJECT_ID

    Ganti kode berikut:

    • INSTANCE_ID: ID instance tempat Anda ingin mengaktifkan mesin columnar.
    • REGION: region tempat instance Anda berada—misalnya, us-central1.
    • CLUSTER_ID: ID cluster tempat instance Anda berada.
    • PROJECT_ID: ID project tempat cluster Anda berada.

    Untuk mengetahui informasi selengkapnya tentang cara menyetel flag, lihat Mengonfigurasi flag database.

  • Buat indeks ScaNN atau Buat indeks HNSW di database Anda.

Menambahkan indeks ke mesin columnar

Setelah mengaktifkan mesin columnar, Anda dapat menambahkan indeks yang ada ke cache menggunakan fungsi SQL google_columnar_engine_add_index().

Untuk menambahkan indeks ke mesin columnar, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud , buka halaman Clusters.

    Buka Cluster

  2. Untuk menampilkan halaman Ringkasan cluster, klik nama cluster AlloyDB di kolom Nama resource.

  3. Di panel navigasi, klik AlloyDB Studio.

  4. Login ke AlloyDB Studio menggunakan nama database, nama pengguna, dan sandi Anda.

  5. Di tab Editor 1, masukkan kueri berikut:

    SELECT google_columnar_engine_add_index('INDEX_NAME');
    

    Ganti INDEX_NAME dengan nama indeks vektor Anda.

    1. Klik Run.

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 Anda dipercepat oleh mesin berbasis kolom menggunakan rencana EXPLAIN (ANALYZE, COLUMNAR_ENGINE) pada kueri Anda.

Memverifikasi penggunaan cache

Untuk memverifikasi bahwa kueri vektor Anda dipercepat oleh mesin berbasis kolom, 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)

Kehadiran columnar engine nodes hit dan Columnar Engine ScaNN Info: (index found=true) dalam output mengonfirmasi bahwa mesin berbasis kolom digunakan untuk kueri.

Contoh rencana eksekusi HNSW

Rencana eksekusi menampilkan bagian Info HNSW Columnar Engine 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 mesin columnar:

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 sedang dipercepat oleh mesin kolom, karena semua elemen diambil dari mesin kolom (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, mesin columnar menggunakan pendekatan hybrid untuk menjaga akurasi dan performa. Model ini membaca vektor yang valid dan di-cache langsung dari memori, dan hanya mengambil vektor yang diubah atau baru dari disk.

Jika Anda mengubah sejumlah besar data, Anda mungkin akan melihat peningkatan sementara pada elements_from_disk dan penurunan performa hingga cache dimuat ulang.

Mengelola indeks yang di-cache

Untuk mengelola siklus proses indeks yang di-cache, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud , buka halaman Clusters.

    Buka Cluster

  2. Untuk menampilkan halaman Ringkasan cluster, klik nama cluster AlloyDB di kolom Nama resource.

  3. Di panel navigasi, klik AlloyDB Studio.

  4. Login ke AlloyDB Studio menggunakan nama database, nama pengguna, dan sandi Anda.

  5. Di tab Editor 1, masukkan perintah SQL untuk tugas yang Anda pilih:

    • Untuk memperbarui 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.

  6. Klik Run.

Batasan

Memperbarui indeks HNSW yang dipercepat mesin berbasis kolom dapat menggunakan memori hingga dua kali ukuran indeks untuk sementara.

Langkah berikutnya