La mise en cache de vos index dans le moteur de données en colonnes diffuse les requêtes directement à partir d'une représentation en mémoire optimisée en lecture de l'index et augmente le nombre de requêtes par seconde (RPS) que votre base de données peut gérer pour les charges de travail de recherche vectorielle.
Vous ne pouvez utiliser HNSW avec le moteur de données en colonnes que pour les clusters AlloyDB Omni exécutant PostgreSQL 17 ou une version ultérieure. Cette limite ne s'applique pas à ScaNN avec le moteur de données en colonnes.
Avant de commencer
Définissez les flags de base de données
google_columnar_engine.enabledetgoogle_columnar_engine.enable_index_cachingsuronpour activer le moteur de données en colonnes et sa fonctionnalité de mise en cache des index.Pour définir les flags de base de données, exécutez la
ALTER SYSTEMcommande PostgreSQL :ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_index_caching = 'on';Rechargez la configuration du gestionnaire `systemd` et redémarrez le service `alloydbomni` pour que les modifications prennent effet:
```posix-terminal sudo systemctl restart alloydbomni18Pour en savoir plus sur la définition des flags, consultez Configurer des flags de base de données.
Créez un index ScaNN ou 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, exécutez la requête suivante :
SELECT google_columnar_engine_add_index('INDEX_NAME');
Remplacez INDEX_NAME par le nom de votre index vectoriel.
Une fois que vous avez ajouté un index au moteur de données en colonnes, toutes les requêtes qui utilisent cet index 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 à l'aide du 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
Voici un exemple de plan d'exécution pour une requête qui utilise un index ScaNN qui a été 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 Columnar Engine HNSW Info (Informations HNSW du moteur de données en colonnes) pour l'index respectif, qui affiche 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 à partir du disque (elements_from_disk).
Voici un exemple de plan d'exécution pour une requête qui utilise un index HNSW qui a été 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 des instructions INSERT, UPDATE ou DELETE invalident les 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 mis en cache valides directement à partir de la mémoire et ne récupère que les vecteurs modifiés ou nouveaux à partir du disque.
Si vous modifiez une grande quantité de données, vous constaterez peut-être temporairement une augmentation des éléments_from_disk et une baisse des performances jusqu'à ce que le cache soit actualisé.
Gérer l'index mis en cache
Pour gérer le cycle de vie de vos index mis en cache, exécutez la commande SQL pour 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.
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 en mémoire.
Étape suivante
- Créer des index et des vecteurs de requête à l'aide de ScaNN
- Présentation du moteur de données en colonnes
- Gérer les colonnes manuellement
- Effectuer une recherche vectorielle