Accélérer la recherche vectorielle avec le moteur de données en colonnes

Le moteur de données en colonnes AlloyDB pour PostgreSQL vous permet d'accélérer les recherches vectorielles qui utilisent des index ScaNN (Scalable Nearest Neighbors) ou HNSW (Hierarchical Navigable Small World). En mettant en cache les index vectoriels dans une représentation en mémoire optimisée pour la lecture, le moteur de données en colonnes diffuse les requêtes directement à partir de la mémoire et augmente le nombre de requêtes par seconde (RPS) pour les charges de travail de Vector Search.

Vous ne pouvez utiliser HNSW avec le moteur de données en colonnes que pour les clusters AlloyDB exécutant PostgreSQL 17 ou une version ultérieure. ScaNN avec le moteur de données en colonnes n'a pas cette limite.

Avant de commencer

  • Définissez les indicateurs de base de données google_columnar_engine.enabled et google_columnar_engine.enable_index_caching sur on pour activer le moteur de données en colonnes et sa fonctionnalité de cache d'index.

    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

    Remplacez les éléments suivants :

    • INSTANCE_ID : ID de l'instance sur laquelle vous souhaitez activer le moteur de colonnes.
    • REGION : région où se trouve votre instance, par exemple us-central1.
    • CLUSTER_ID : ID du cluster dans lequel se trouve votre instance.
    • PROJECT_ID : ID du projet où se trouve votre cluster.

    Pour en savoir plus sur la définition des indicateurs de base de données, consultez Configurer des indicateurs de base de données.

  • Créez un index ScaNN ou créez un index HNSW dans votre base de données.

Ajouter un index au moteur de données en colonnes

Après avoir activé le moteur de données en colonnes, vous pouvez ajouter un index existant au cache à l'aide de la fonction SQL google_columnar_engine_add_index().

Pour ajouter un index au moteur de données en colonnes, procédez comme suit :

  1. Dans la console Google Cloud , accédez à la page Clusters.

    accéder aux clusters

  2. Pour afficher la page Présentation du cluster, cliquez sur le nom du cluster AlloyDB dans la colonne Nom de la ressource.

  3. Dans le volet de navigation, cliquez sur AlloyDB Studio.

  4. Connectez-vous à AlloyDB Studio à l'aide du nom de votre base de données, de votre nom d'utilisateur et de votre mot de passe.

  5. Dans l'onglet Éditeur 1, saisissez la requête suivante :

    SELECT google_columnar_engine_add_index('INDEX_NAME');
    

    Remplacez INDEX_NAME par le nom de votre index vectoriel.

    1. Cliquez sur Exécuter.

Après avoir ajouté un index au moteur de données en colonnes, toutes les requêtes qui l'utilisent sont automatiquement accélérées par le moteur de données en colonnes. Vous pouvez vérifier que vos requêtes vectorielles sont accélérées par le moteur de données en colonnes en utilisant le plan EXPLAIN (ANALYZE, COLUMNAR_ENGINE) sur votre requête.

Vérifier l'utilisation du cache

Pour vérifier que vos requêtes vectorielles sont accélérées par le moteur de données en colonnes, vous pouvez utiliser le plan EXPLAIN (ANALYZE, COLUMNAR_ENGINE) sur votre requête.

Exemple de plan d'exécution ScaNN (preview)

Voici un exemple de plan d'exécution pour une requête qui utilise un index ScaNN ajouté au moteur de données en colonnes :

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)

La présence de columnar engine nodes hit et Columnar Engine ScaNN Info: (index found=true) dans le résultat confirme que le moteur de données en colonnes est utilisé pour la requête.

Exemple de plan d'exécution HNSW

Le plan d'exécution affiche la section Informations HNSW du moteur de données en colonnes pour l'index respectif, qui indique des métriques telles que le ratio d'éléments récupérés à partir du moteur de données en colonnes (elements_from_ce) et du disque (elements_from_disk).

Voici un exemple de plan d'exécution pour une requête qui utilise un index HNSW ajouté au moteur de données en colonnes :

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)

La réponse indique que l'index est accéléré par le moteur de données en colonnes, car tous les éléments ont été récupérés à partir du moteur de données en colonnes (elements_from_ce=385) et aucun n'a été récupéré à partir du disque (elements_from_disk=0).

Lorsque des modifications de données telles que les instructions INSERT, UPDATE ou DELETE invalident des entrées de cache, le moteur de données en colonnes utilise une approche hybride pour maintenir la précision et les performances. Il lit les vecteurs valides mis en cache directement depuis la mémoire et ne récupère que les vecteurs modifiés ou nouveaux depuis le disque.

Si vous modifiez une grande quantité de données, vous constaterez peut-être une augmentation temporaire de elements_from_disk et une baisse des performances jusqu'à l'actualisation du cache.

Gérer l'index mis en cache

Pour gérer le cycle de vie de vos index mis en cache, procédez comme suit :

  1. Dans la console Google Cloud , accédez à la page Clusters.

    accéder aux clusters

  2. Pour afficher la page Présentation du cluster, cliquez sur le nom du cluster AlloyDB dans la colonne Nom de la ressource.

  3. Dans le volet de navigation, cliquez sur AlloyDB Studio.

  4. Connectez-vous à AlloyDB Studio à l'aide du nom de votre base de données, de votre nom d'utilisateur et de votre mot de passe.

  5. Dans l'onglet Éditeur 1, saisissez la commande SQL correspondant à la tâche sélectionnée :

    • Pour actualiser le cache manuellement, exécutez la commande suivante :

      SELECT google_columnar_engine_refresh_index('INDEX_NAME');
      
    • Pour vérifier l'état de l'index, exécutez la commande suivante :

      SELECT google_columnar_engine_verify('INDEX_NAME');
      
    • Pour supprimer l'index du cache, exécutez la commande suivante :

      SELECT google_columnar_engine_drop_index('INDEX_NAME');
      
    • Pour afficher les index actifs, exécutez la commande suivante :

      SELECT * FROM g_columnar_indexes;
      
    • Pour afficher les index partitionnés, exécutez la commande suivante :

      SELECT * FROM g_columnar_index_partitions;
      

    Remplacez INDEX_NAME par le nom de votre index.

  6. Cliquez sur Exécuter.

Limites

L'actualisation des index HNSW accélérés par le moteur de données en colonnes peut consommer temporairement jusqu'à deux fois la taille de l'index.

Étapes suivantes