Le réglage de vos index vectoriels dans AlloyDB pour PostgreSQL vous permet d'optimiser la vitesse d'exécution des requêtes et le rappel de recherche pour vos charges de travail de recherche vectorielle. Vous pouvez ajuster les paramètres de création d'index et les paramètres de requête pour les index ScaNN, IVF, IVFFlat et HNSW en fonction de la taille de votre ensemble de données et de vos exigences en termes de performances.
Avant de commencer
Avant de créer un index ScaNN, procédez comme suit :
Créez une table avec vos données.
Pour éviter les problèmes de mémoire insuffisante lorsque vous créez l'index ScaNN, assurez-vous que les
maintenance_work_memetshared_buffersindicateurs de base de données sont définis sur une valeur inférieure à la mémoire totale de la machine.Pour utiliser des index à quatre niveaux, vous devez d'abord activer la fonctionnalité d'aperçu pour votre instance AlloyDB. Pour activer la fonctionnalité d'aperçu, choisissez l'une des deux méthodes suivantes :
Activez l'
scann.enable_preview_featuresindicateur de base de données.Pour en savoir plus sur la configuration des indicateurs de base de données, consultez Configurer des indicateurs de base de données.
Définissez l'indicateur de base de données
scann.max_allowed_num_levelsau niveau de la session sur3.SET scann.max_allowed_num_levels = 3;
Régler un index ScaNN
Pour déterminer le nombre de niveaux nécessaires pour votre index ScaNN, consultez le tableau suivant.
| Nombre de lignes vectorielles dans votre table | Nombre de niveaux pour votre index ScaNN |
|---|---|
| [0 à 10 millions] | Deux |
| [10 à 100 millions] |
Choisissez l'une des métriques suivantes à privilégier :
|
| [100 millions à 1 milliard] |
Choisissez l'une des métriques suivantes à privilégier :
|
| [1 à 10 milliards] | Quatre (en aperçu) |
Utilisez les index ScaNN suivants comme exemples pour régler les paramètres d'une table comportant 1 million de lignes.
Index arborescent à deux niveaux
SET LOCAL scann.num_leaves_to_search = 1; SET LOCAL scann.pre_reordering_num_neighbors=50; CREATE INDEX my_scann_index ON my_table USING scann (vector_column cosine) WITH (num_leaves = [power(1000000, 1/2)]);
Index arborescent à trois niveaux
SET LOCAL scann.num_leaves_to_search = 10; SET LOCAL scann.pre_reordering_num_neighbors=50; CREATE INDEX my_scann_index ON my_table USING scann (vector_column cosine) WITH (num_leaves = [power(1000000, 2/3)], max_num_levels = 2);
Index arborescent à quatre niveaux
SET LOCAL scann.num_leaves_to_search = 100; SET LOCAL scann.pre_reordering_num_neighbors=50; CREATE INDEX my-scann-index ON my-table USING scann (vector_column cosine) WITH (num_leaves = [power(1000000, 3/4)], max_num_levels = 3);
Pour en savoir plus sur les index ScaNN, consultez les pages suivantes :
Gérer les invalidations LMD dues à l'accélération avec le moteur de données en colonnes
Si vous avez choisi d'accélérer vos recherches vectorielles avec le moteur de données en colonnes, sachez que les invalidations LMD et LDD
sur les tables de base peuvent avoir un impact sur les performances des requêtes vectorielles. En cas de débit LMD élevé, envisagez de régler l'indicateur de base de données google_columnar_engine.refresh_threshold_percentage ou d'actualiser manuellement l'index à l'aide de la commande google_columnar_engine_refresh_index.
Analyser vos requêtes
Utilisez la commande EXPLAIN ANALYZE pour analyser les insights sur les requêtes, comme indiqué dans l'exemple de requête SQL suivant.
EXPLAIN ANALYZE SELECT result-column
FROM my_table
ORDER BY EMBEDDING_COLUMN <-> embedding('text-embedding-005', 'What is a database?')::vector
LIMIT 1;
L'exemple de réponse QUERY PLAN inclut des informations telles que le temps écoulé, le nombre de lignes analysées ou renvoyées, ainsi que les ressources utilisées.
Limit (cost=0.42..15.27 rows=1 width=32) (actual time=0.106..0.132 rows=1 loops=1)
-> Index Scan using my_scann_index on my_table (cost=0.42..858027.93 rows=100000 width=32) (actual time=0.105..0.129 rows=1 loops=1)
Order By: (embedding_column <-> embedding('text-embedding-005', 'What is a database?')::vector(768))
Limit value: 1
Planning Time: 0.354 ms
Execution Time: 0.141 ms
Afficher les métriques d'index vectoriel
Vous pouvez utiliser les métriques d'index vectoriel pour examiner les performances de votre index vectoriel, identifier les points à améliorer et ajuster votre index en fonction des métriques, si nécessaire. La vue pg_stat_ann_indexes vous aide à comprendre l'état d'utilisation de l'index, tandis que la vue pg_stat_ann_index_creation fournit des informations sur les lignes créées au moment de la création de l'index.
Pour afficher les métriques d'utilisation de l'index, exécutez la commande suivante :
SELECT * FROM pg_stat_ann_indexes;
Vous obtenez un résultat semblable à celui-ci :
-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid | 271236
indexrelid | 271242
schemaname | public
relname | t1
indexrelname | t1_ix1
indextype | scann
indexconfig | {num_leaves=100,max_num_levels=1,quantizer=SQ8}
indexsize | 832 kB
indexscan | 0
insertcount | 250
deletecount | 0
updatecount | 0
partitioncount | 100
distribution | {"average": 3.54, "maximum": 37, "minimum": 0, "outliers": [37, 12, 11, 10, 10, 9, 9, 9, 9, 9]}
distributionpercentile |{"10": { "num_vectors": 0, "num_partitions": 0 }, "25": { "num_vectors": 0, "num_partitions": 30 }, "50": { "num_vectors": 3, "num_partitions": 30 }, "75": { "num_vectors": 5, "num_partitions": 19 }, "90": { "num_vectors": 7, "num_partitions": 11 }, "95": { "num_vectors": 9, "num_partitions": 5 }, "99": { "num_vectors": 12, "num_partitions": 4 }, "100": { "num_vectors": 37, "num_partitions": 1 }}
Pour afficher le nombre de lignes créées au moment de la création de l'index, exécutez la commande suivante :
SELECT * FROM pg_stat_ann_index_creation;
Vous obtenez un résultat semblable à celui-ci :
-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid | 271236
indexrelid | 271242
schemaname | public
relname | t1
indexrelname | t1_ix1
index_rows_at_creation_time | 262144
Pour obtenir la liste complète des métriques, consultez Métriques d'index vectoriel.
Étape suivante
- Gérer les index vectoriels.
- Découvrez un exemple de workflow d'embedding.