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.
Quand fastupdate
est activé pour
GIN(voir Section 67.4.1 pour les
détails), la pénalité est moindre que quand il n'est pas activé. 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 pour lequel l'option fastupdate
est activé,
le système nettoiera la liste d'entrées en attente dès qu'elle
deviendra plus grosse que la limite indiquée par
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 le processus 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 de temps.
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é d'ajouter les recherches plein texte dans PostgreSQL et il arrive fréquemment qu'une recherche de ce type 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.