Gestire gli indici vettoriali

La manutenzione degli indici vettoriali ScaNN (Scalable Nearest Neighbors) in AlloyDB per PostgreSQL aiuta a preservare il richiamo della ricerca e le prestazioni delle query man mano che i dati della tabella cambiano nel tempo. Puoi monitorare le metriche di distribuzione degli indici per rilevare la deviazione dei dati e fare affidamento sulla manutenzione automatica degli indici o sulle ricostruzioni manuali per mantenere bilanciati gli indici vettoriali.

Prima di iniziare

Prima di gestire la manutenzione degli indici, installa o aggiorna le estensioni vector e alloydb_scann:

  • Se le estensioni vector e alloydb_scann non sono installate, installale.

    CREATE EXTENSION IF NOT EXISTS vector;
    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    
  • Se le estensioni vector e alloydb_scann sono già installate, aggiornale.

    ALTER EXTENSION vector UPDATE;
    ALTER EXTENSION alloydb_scann UPDATE;
    

Gestisci gli indici automaticamente

Puoi consentire ad AlloyDB di gestire automaticamente gli indici vettoriali. Man mano che il set di dati cresce, AlloyDB analizza e aggiorna i centroidi e suddivide le partizioni di outlier di grandi dimensioni. In questo modo, le query al secondo (QPS) e la qualità dei risultati di ricerca migliorano automaticamente. Gli aggiornamenti automatici sono permanenti fino alla successiva esecuzione della manutenzione.

AlloyDB attiva la manutenzione automatica degli indici per impostazione predefinita per gli indici ScaNN ottimizzati automaticamente. Se vuoi creare indici ScaNN ottimizzati automaticamente, ma disattivare la manutenzione automatica, consulta Disattiva la manutenzione automatica per gli indici automatici.

Per abilitare la manutenzione automatica per gli indici creati manualmente, consulta Abilita la manutenzione automatica durante la creazione dell'indice.

Abilita la manutenzione automatica durante la creazione dell'indice

Per attivare la manutenzione automatica durante la creazione dell'indice, imposta il parametro auto_maintenance su on. Ad esempio, vedi il seguente comando che crea un indice vettoriale ScaNN.

CREATE INDEX INDEX_NAME ON TABLE_NAME \
USING scann (EMBEDDING_COLUMN_NAME DISTANCE_FUNCTION_NAME) \
WITH (mode='INDEX_MODE', num_leaves=NUM_PARTITIONS, auto_maintenance=on);

Sostituisci le seguenti variabili:

  • INDEX_NAME: il nome dell'indice che vuoi creare. Ad esempio, my_scann_index. I nomi degli indici sono condivisi nel database. Assicurati che ogni nome di indice sia univoco per ogni tabella del database.

  • TABLE_NAME: la tabella a cui vuoi aggiungere l'indice.

  • EMBEDDING_COLUMN_NAME: la colonna che memorizza i dati vector che vuoi indicizzare.

  • DISTANCE_FUNCTION_NAME: la funzione di distanza da utilizzare con questo indice. Scegli una delle opzioni seguenti:

    • Distanza L2: l2

    • Prodotto scalare: dot_product

    • Distanza coseno: cosine

  • INDEX_MODE: la modalità in cui creare l'indice ScaNN. I valori disponibili sono i seguenti:

    • AUTO: AlloyDB gestisce e ottimizza automaticamente la struttura dell'indice. Il valore auto_maintenance predefinito, quando mode è impostato su AUTO, è on.

    • MANUAL: gestisci e ottimizza manualmente l'indice ScaNN. Il valore predefinito di auto_maintenance, quando mode è impostato su MANUAL, è off.

    Per saperne di più sulla modalità di indice da utilizzare, consulta Crea un indice ScaNN.

  • NUM_PARTITIONS: il numero di partizioni da applicare a questo indice. Imposta questo valore su un numero compreso tra 1 e 104.857.600 per PostgreSQL versione 17 e successive e tra 1 e 30 milioni per PostgreSQL versione 16 e precedenti. Per ulteriori informazioni su come decidere questo valore, consulta Ottimizza un indice ScaNN.

Configura la manutenzione automatica per gli indici esistenti

Per configurare la manutenzione automatica per gli indici manuali esistenti, esegui il seguente comando:

ALTER INDEX INDEX_NAME SET (auto_maintenance = AUTOMATIC_MAINTENANCE);

Sostituisci le seguenti variabili:

  • INDEX_NAME: il nome dell'indice che vuoi modificare. Ad esempio, my_scann_index.

  • AUTOMATIC_MAINTENANCE: attiva o disattiva la manutenzione automatica. Per attivare, imposta il valore su on. Per disattivare, imposta il valore su off.

Aumenta il throughput della manutenzione automatica

Per aumentare la velocità effettiva della manutenzione automatica, configura il flag di database scann.max_background_workers. L'aumento del numero di worker in background aumenta il numero di indici elaborati per unità di tempo. Non riduce il tempo di elaborazione dei singoli indici. Questo valore deve essere inferiore al valore max_worker_processes impostato per il cluster di database.

Per saperne di più sulla configurazione dei flag di database, consulta Configura i flag di database di un'istanza.

Aumenta il ritardo della manutenzione automatica

Per aumentare il ritardo tra le esecuzioni della manutenzione automatica, configura il flag di database scann.maintenance_background_naptime_s.

Per saperne di più sulla configurazione dei flag di database, consulta Configura i flag di database di un'istanza.

Percentuale di partizioni della rete di ricerca

Man mano che il numero di partizioni aumenta perché AlloyDB suddivide automaticamente le partizioni anomale di grandi dimensioni, ti consigliamo di regolare il numero di foglie in cui eseguire la ricerca per mantenere prestazioni ottimali. Per gestire questo numero automaticamente, configura il parametro scann.pct_leaves_to_search.

scann.pct_leaves_to_search rappresenta la percentuale di partizioni correnti da cercare. Puoi impostare questo parametro su qualsiasi valore compreso tra 0 e 100. Il valore predefinito è 0, che disattiva questo parametro e utilizza invece il valore impostato in scann.num_leaves_to_search. Se anche scann.num_leaves_to_search è impostato su 0, AlloyDB utilizza per impostazione predefinita 1% di foglie.

Se prevedi che il set di dati crescerà in modo significativo, imposta il valore iniziale su 1.

Per impostare scann.pct_leaves_to_search, esegui questo comando:

ALTER DATABASE DB_NAME SET scann.pct_leaves_to_search = PERCENTAGE_PARTITIONS_TO_SEARCH;

Sostituisci le seguenti variabili:

  • DB_NAME: il nome del database.

  • PERCENTAGE_PARTITIONS_TO_SEARCH: percentuale di partizioni in cui eseguire la ricerca.

Richiama manualmente la manutenzione degli indici

Se vuoi richiamare manualmente la manutenzione su un indice specifico, esegui questo comando:

SELECT scann_index_maintenance('INDEX_NAME');

Sostituisci INDEX_NAME con il nome dell'indice su cui vuoi richiamare la manutenzione. Ad esempio, my_scann_index.

Disabilita la manutenzione automatica per gli indici automatici

Per disattivare la manutenzione automatica per gli indici ScaNN ottimizzati automaticamente, imposta il parametro auto_maintenance su OFF durante la creazione dell'indice. Ad esempio, il seguente comando crea un indice ScaNN ottimizzato automaticamente:

CREATE INDEX similarity_index ON products
       USING scann (description_embedding cosine)
WITH (mode = 'AUTO', auto_maintenance = 'OFF');

Se vuoi disattivare la manutenzione automatica su un indice ScaNN ottimizzato automaticamente esistente, consulta Configura la manutenzione automatica per gli indici esistenti.

Ricrea manualmente l'indice

Se la tabella è soggetta ad aggiornamenti o inserimenti frequenti, ti consigliamo di ricreare periodicamente l'indice ScaNN per migliorare l'accuratezza del richiamo. Per maggiori informazioni sulla visualizzazione delle modifiche nelle distribuzioni o nelle mutazioni dei vettori dalla creazione dell'indice, consulta Visualizza le metriche dell'indice vettoriale.

Per ricostruire manualmente l'indice utilizzando le configurazioni originali, esegui il seguente comando:

REINDEX INDEX CONCURRENTLY INDEX_NAME;

Sostituisci INDEX_NAME con il nome dell'indice che vuoi ricreare. Ad esempio, my_scann_index.

Per saperne di più sulla reindicizzazione in PostgreSQL, consulta REINDEX.

Passaggi successivi