web-dev-qa-db-fra.com

Différence entre l'indice Gist et l'indice GIN

J'implémente une table qui a une colonne avec un type de données tsvector et j'essaie de comprendre quel index serait préférable d'utiliser?

GIN ou GiST?

En parcourant la documentation postgres ici je semble comprendre que:

  • Gist est plus rapide pour mettre à jour et construire l'index et moins précis que gin.

  • GIN est plus lent à mettre à jour et à construire l'index mais est plus précis.

OK, alors pourquoi voudrait-on un champ indexé Gist sur gin? Si Gist pouvait vous donner les mauvais résultats? Il doit y avoir un avantage (performances extérieures) à ce sujet.

Quelqu'un peut-il expliquer en termes simples comment je voudrais utiliser GIN contre GiST?

42
Walker Farrow

Je ne pense pas que je pourrais l'expliquer mieux que le manuel le fait déjà:

Pour choisir le type d'index à utiliser, Gist ou GIN, tenez compte de ces différences de performances:

  • Les recherches d'index GIN sont environ trois fois plus rapides que Gist

  • La construction des index GIN prend environ trois fois plus de temps que Gist

  • Les index GIN sont modérément plus lents à mettre à jour que les index Gist, mais environ 10 fois plus lentement si la prise en charge de la mise à jour rapide était désactivée [...]

  • Les index GIN sont deux à trois fois plus grands que les index Gist

Le lien est vers le manuel actuel, le devis est de la version 9.4, tandis que votre lien est vers la version 9.1 (pour une raison quelconque?).

Les estimations de taille et de performances semblent légèrement dépassées dans le manuel - et ont depuis été supprimées.
Avec Postgres 9.4, les chances ont considérablement changé en faveur de GIN .
Les notes de publication de Postgres 9.4 incluent:

  • Réduire la taille de l'indice GIN (Alexander Korotkov, Heikki Linnakangas) [...]

  • Améliorez la vitesse des recherches GIN multi-clés (Alexander Korotkov, Heikki Linnakangas)

Notez qu'il existe cas d'utilisation spéciaux qui nécessitent l'un ou l'autre.

Une chose que vous avez mal comprise: vous jamais obtenez de mauvais résultats avec un index Gist. L'index fonctionne sur des valeurs de hachage, ce qui peut conduire à des faux positifs dans l'index. Cela ne devrait devenir pertinent qu'avec un très grand nombre de mots différents dans vos documents. Les faux positifs sont éliminés après avoir revérifié la ligne réelle dans tous les cas. Le manuel :

Un index Gist est avec perte, ce qui signifie que l'index peut produire de fausses correspondances, et il est nécessaire de vérifier la ligne de table réelle pour éliminer ces fausses correspondances. ( PostgreSQL le fait automatiquement en cas de besoin. )

Accentuation mienne.

68
Erwin Brandstetter