Memahami pemfilteran adaptif di AlloyDB AI

Halaman ini memberikan ringkasan konseptual tentang pemfilteran adaptif di AlloyDB AI, sebuah fitur yang dirancang untuk mengoptimalkan penelusuran vektor yang difilter.

Apa yang dimaksud dengan pemfilteran adaptif?

Pemfilteran adaptif menganalisis pola kueri dan distribusi data selama eksekusi kueri untuk memilih strategi pemfilteran yang paling efisien secara dinamis, seperti pemfilteran inline atau pra-pemfilteran.

Pengoptimal kueri AI AlloyDB menggunakan analisis berbasis biaya untuk menentukan apakah pemfilteran inline atau pra-pemfilteran memberikan performa terbaik pada titik tertentu selama eksekusi kueri.

Jenis pengoptimalan ini mendukung penelusuran vektor yang difilter AlloyDB AI, dengan pemfilteran adaptif yang otomatis beralih antara penggunaan indeks vektor dan metadata, sehingga menghasilkan hasil yang efisien dan akurat tanpa intervensi manual.

Beralih secara dinamis antara strategi pemfilteran

Pemfilteran adaptif secara otomatis dan dinamis beralih antara strategi pemfilteran inline dan pra-pemfilteran selama eksekusi kueri berdasarkan pola kueri real-time dan distribusi data. Pengoptimal kueri AI AlloyDB menggunakan analisis berbasis biaya untuk menentukan strategi mana yang memberikan performa terbaik pada waktu tertentu.

Dari inline hingga pra-pemfilteran

Saat pengoptimal menentukan bahwa pra-pemfilteran lebih efisien, pemfilteran adaptif akan memicu peralihan dari pemfilteran inline ke pra-pemfilteran selama eksekusi. Rencana kueri akan berubah secara dinamis untuk mencerminkan hal ini.

Misalnya, rencana dapat menampilkan Bitmap assisted pre-filtering di kolom Strategi Eksekusi saat pengoptimal menentukan bahwa pra-pemfilteran lebih efisien pada titik tersebut dalam kueri. Perubahan dinamis ini terjadi saat sistem beradaptasi dengan data sebenarnya yang ditemuinya selama eksekusi kueri.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted pre-filtering
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

Saat menggunakan Execution Strategy: Bitmap assisted pre-filtering, Bitmap Index Scan terpisah akan memfilter set data besar terlebih dahulu. Jika prapenyaringan ini secara efektif mempersempit kandidat, indeks vektor tidak digunakan untuk penelusuran kemiripan vektor akhir.

Dari pra-pemfilteran hingga pemfilteran inline

Pemfilteran adaptif juga dapat beralih secara dinamis dari pra-pemfilteran ke pemfilteran inline jika pengoptimal kueri AI AlloyDB menentukan bahwa pemfilteran inline lebih efisien untuk karakteristik kueri saat ini.

Dalam kasus tersebut, rencana kueri akan disesuaikan secara dinamis untuk mencerminkan pemrosesan data vektor yang lebih langsung tanpa langkah prapenyaringan eksplisit sebelum pemindaian vektor. Kemampuan beradaptasi ini membantu mencapai performa optimal saat distribusi data atau parameter kueri berubah selama runtime.

Misalnya, rencana kueri menampilkan vector scan di kolom Strategi Eksekusi saat pengoptimal menentukan bahwa strategi pemfilteran inline lebih efisien untuk kueri tertentu.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted vector Scan on scann_idx
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        Num Requalifications: 0
        Num filtered: 1000
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

Dalam contoh ini, Execution Strategy menampilkan Bitmap assisted vector Scan on scann_idx, dengan Bitmap Index Scan yang mendasarinya di btree_idx. Hal ini menunjukkan bahwa penelusuran vektor menggunakan filter bitmap, yang dihasilkan oleh Pemindaian Indeks Bitmap berdasarkan kondisi int_col <= 100000000. Custom Scan (vector scan) kemudian hanya memproses baris yang diidentifikasi oleh bitmap ini, mengintegrasikan pemfilteran langsung ke dalam proses pemindaian vektor.

Contoh: Cara selektivitas memicu peralihan dinamis

Pemfilteran adaptif mendasarkan keputusannya pada selektivitas filter standar Anda. Jika filter menghilangkan sejumlah besar data, pengoptimal kemungkinan akan memilih pra-pemfilteran. Jika filter membiarkan sebagian besar data tetap utuh, pengoptimal kemungkinan akan memilih pemfilteran inline.

Anda dapat mengamati peralihan dinamis ini secara real-time dengan menjalankan kueri yang sama dan menyesuaikan selektivitas klausa WHERE.

Misalnya, saat mengkueri tabel besar produk retail, Anda mungkin ingin melakukan penelusuran vektor hanya pada item di bawah harga tertentu.

Selektivitas rendah

Pertama, Anda menelusuri produk di bawah Rp10.000.000. Karena hampir setiap produk dalam database di bawah $1.000, filter memiliki selektivitas rendah. Pengoptimal kueri AI AlloyDB menentukan bahwa pengumpulan hampir seluruh database ke dalam daftar yang telah difilter sebelumnya tidak efisien, sehingga melakukan pemindaian vektor inline.

Jika melihat rencana kueri, Anda akan melihat bahwa sistem secara dinamis beradaptasi dengan set data besar dan memilih pemfilteran inline.

  Limit (actual rows=10)
    -> Custom Scan (vector scan)
    Execution Strategy: Bitmap assisted vector Scan on scann_idx
    Order By: (vec <=> '[...]'::vector)
    -> Bitmap Index Scan
       Index Cond: (price <= 1000)

Selektivitas tinggi

Selanjutnya, Anda mengubah kueri untuk menelusuri produk di bawah Rp100.000. Saat kueri mulai dieksekusi, pengoptimal kueri AI AlloyDB awalnya bersiap untuk menggunakan pemfilteran inline. Perencana secara keliru mengasumsikan bahwa filter tidak terlalu selektif. Hal ini lebih sering terjadi dari yang diperkirakan karena statistik yang digunakan untuk membuat perkiraan ini tidak selalu akurat atau terbaru. Namun, dengan cepat ditentukan bahwa filter harga memiliki selektivitas tinggi: sangat sedikit item dalam database yang memiliki harga serendah ini. Pengoptimal menentukan bahwa mengumpulkan beberapa baris ini sebelum melakukan pemindaian vektor jauh lebih cepat, sehingga pengoptimal secara dinamis mengalihkan strategi ke pra-pemfilteran.

Paket kueri mencerminkan pivot real-time ini. Sistem memilih untuk memfilter set data kecil sebelum memindai vektor.

Pilihan awal perencana

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted vector Scan on scann_idx
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

Eksekusi sebenarnya (tombol adaptif)

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted pre-filtering
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

Anda tidak perlu menulis ulang kode aplikasi atau memperbarui indeks database secara manual saat distribusi data Anda berubah seiring waktu. AI AlloyDB menangani logika perutean untuk Anda di setiap kueri, sehingga memastikan performa tinggi.

Langkah berikutnya