L'insertion dans un index GIN peut être lente du fait de la probabilité d'insertion de nombreuses clés pour chaque élément. C'est pourquoi, pour les chargements massifs dans une table, il est conseillé de supprimer l'index GIN et de le re-créer après le chargement.
À partir de PostgreSQL 8.4, ce conseil est moins important puisqu'une technique de mise à jour retardée est utilisée (voir Section 66.4.1 pour plus de détails). Mais pour les très grosses mises à jour, il peut toujours être plus efficace de détruire et recréer l'index.
Le temps de construction d'un index GIN dépend
grandement du paramètre maintenance_work_mem
;
il est contre-productif de limiter la mémoire de travail lors de la création d'un index.
Durant une série d'insertions dans un index GIN existant
qui a fastupdate
activé, le système nettoiera la liste
d'entrées en attente dès qu'elle deviendra plus grosse que
gin_pending_list_limit
. Afin d'éviter des fluctuations mesurables
de temps de réponse, il est souhaitable d'avoir un nettoyage de la liste
d'attente en arrière-plan (c'est-à-dire via autovacuum). Les opérations
de nettoyage en avant-plan peuvent être évitées en augmentant
gin_pending_list_limit
ou en rendant autovacuum plus aggressif.
Toutefois, augmenter la limite de l'opération de nettoyage implique que si un nettoyage
en avant-plan se produit, il prendra encore plus longtemps.
gin_pending_list_limit
peut être surchargé sur
certains index en modifiant les paramètres de stockage, ce qui permet à
chaque index d'avoir sa propre limite de nettoyage. Par exemple, il est
possible d'augmenter la limite uniquement pour un index GIN fortement
mis à jour ou de la diminuer dans le cas contraire.
La raison principale qui a poussé le développement des index GIN a été la volonté de supporter les recherches plein texte dans PostgreSQL et il arrive fréquemment qu'une recherche renvoie un ensemble volumineux de résultats. Cela arrive d'autant plus fréquemment que la requête contient des mots très fréquents, auquel cas l'ensemble de résultats n'est même pas utile. Puisque la lecture des lignes sur disque et leur tri prend beaucoup de temps, cette situation est inacceptable en production. (La recherche dans l'index est, elle, très rapide.)
Pour faciliter l'exécution contrôlée de telles requêtes,
GIN dispose d'une limite supérieure souple
configurable du nombre de lignes renvoyées, le paramètre de configuration
gin_fuzzy_search_limit
. Par défaut, il est
positionné à 0 (c'est-à-dire sans limite). Si une limite différente de
0 est choisie, alors l'ensemble renvoyé est un sous-ensemble du résultat complet, choisi
aléatoirement.
« Souple » signifie que le nombre réel de résultats renvoyés peut différer légèrement de la limite indiquée, en fonction de la requête et de la qualité du générateur de nombres aléatoires du système.
D'expérience, des valeurs de l'ordre de quelques milliers ( 5000 -- 20000) fonctionnent bien.