Ce document explique comment optimiser vos index pour améliorer les performances des requêtes et la récupération.
Avant de créer un index ScaNN
, procédez comme suit:
- Assurez-vous qu'une table contenant vos données a déjà été créée.
- Assurez-vous que la valeur que vous définissez pour l'indicateur
maintenance_work_mem
etshared_buffers
est inférieure à la mémoire totale de la machine pour éviter les problèmes lors de la génération de l'index.
Régler un indice ScaNN
Suivez les conseils ci-dessous pour choisir entre un index ScaNN à deux niveaux et un index ScaNN à trois niveaux:
- Choisissez un indice à deux niveaux si le nombre de lignes vectorielles est inférieur à 10 millions.
- Choisissez un indice à trois niveaux si le nombre de lignes vectorielles dépasse 100 millions.
- Choisissez un indice à trois niveaux pour optimiser le temps de création de l'indice ou un indice à deux niveaux pour optimiser la récupération de recherche si le nombre de lignes vectorielles se situe entre 10 et 100 millions de lignes.
Prenons les exemples suivants d'index ScaNN
à deux et trois niveaux qui montrent comment les paramètres de réglage sont définis pour une table de 1 000 000 lignes:
Index à 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 à 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);
Analyser vos requêtes
Utilisez la commande EXPLAIN ANALYZE
pour analyser vos insights sur les requêtes, comme illustré 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 passé, 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 de l'index vectoriel
Vous pouvez utiliser les métriques de l'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.
Pour afficher toutes les métriques de l'index vectoriel, exécutez la requête SQL suivante, qui utilise la vue pg_stat_ann_indexes
:
SELECT * FROM pg_stat_ann_indexes;
Pour obtenir la liste complète des métriques, consultez la section Métriques de l'index vectoriel.