Question

Je travaille sur l'optimisation de bases de données Postgres mes récemment, et traditionnellement, j'ai jamais utilise seulement les index B-Tree. Cependant, j'ai vu que les index GiST suport index non uniques, multicolonnes, dans la documentation Postgres 8.3.

Je ne pouvais pas, cependant, voir ce que la différence réelle entre eux est. J'espérais que mes collègues pourraient beable codeurs expliquer, quels sont les avantages et les inconvénients entre eux sont, et surtout, les raisons pour lesquelles j'utiliseraient un sur l'autre?

Était-ce utile?

La solution

En bref: les index B-Tree fonctionnent mieux, mais les index GiST sont plus souples. Habituellement, vous voulez index B-Tree s'ils vont travailler pour votre type de données. Il y avait un récent sur la PG liste d'un énorme succès de performance pour l'utilisation des index GiST; ils devraient être plus lent que B-arbres (tel est le prix de la flexibilité), mais pas que beaucoup plus lent ... le travail est, comme on pouvait s'y attendre, en cours.

De un message par Tom Lane , un PostgreSQL ™ développeur:

  

Le principal point de GIST est d'être en mesure de requêtes d'index qui sont simplement   non indexable dans btree. ... On aurait bien   attendre btree de battre GIST pour les cas btree indexable. Je pense que le   point important ici est qu'il est gagné par un facteur d'un couple   cent; c'est assez horrible, et pourrait pointer vers une mise en œuvre   problème.

Autres conseils

En fait droit de tout le monde - est l'indice par défaut btree car il fonctionne très bien. GIST sont des bêtes un peu différentes - il est plus d'un « cadre pour écrire les types d'index » qu'un type d'index lui-même. Vous devez ajouter du code personnalisé (dans le serveur) pour l'utiliser, mais d'autre part - ils sont très flexibles

.

En général - vous ne l'utilisez pas GIST à moins que le type de données que vous utilisez vous dire de le faire. Exemple de types de données qui utilisent GiST:. Ltree (de contrib), tsvector (contrib / tsearch jusqu'à 8,2, dans le noyau depuis 8,3), et d'autres

Il est bien connu, et assez extenstion géographique rapide à PostgreSQL - PostGIS ( http://postgis.refractions.net/ ) qui utilise GiST pour ses fins.

Les index GiST sont lossy dans une certaine mesure, ce qui signifie que le SGBD doit faire face à de faux positifs / négatifs, i.e.:.

  

Les index GiST sont lossy parce que chaque document est représenté dans l'indice par un fixe   signature de la longueur. La signature est   généré par hachage de chaque mot dans un   bit aléatoire dans une chaîne de n bits, avec   tous ces bits OU-ed ensemble pour   produire une signature de documents n bits.   Lorsque deux mots de hachage au même bit   la position il y aura une fausse correspondance.   Si tous les mots dans la requête ont matchs   (Vrai ou faux), la ligne de table   doit être récupéré pour voir si le match   est correct.   b arbres ne sont pas ce comportement, donc en fonction des données indexées, il peut y avoir une certaine différence de performance entre les deux.

Voir texte comportement de recherche http: //www.postgresql. org / docs / 8.3 / statique / textsearch-indexes.html et

GIST sont des indices plus généraux. Vous pouvez les utiliser à des fins plus larges que ceux que vous utiliseriez avec B-Tree. Y compris la possibilité de construire un B-Tree en utilisant GIST.

IE: vous pouvez utiliser GiST pour indexer sur des points géographiques ou des zones géographiques, quelque chose que vous ne serez pas en mesure de le faire avec des index B-Tree, car la seule chose qui importe sur un B-Tree est la clé (ou clés) vous indexation.

scroll top