Domanda

Ho lavorato su come ottimizzare il mio Postgres database di recente, e tradizionalmente, ho sempre e solo utilizzare gli indici B-Tree. Tuttavia, ho visto che gli indici GiST suport non univoci, gli indici più colonne, nella documentazione di Postgres 8.3.

ho potuto, tuttavia, non vedo quale sia la differenza reale tra loro è. Speravo che i miei colleghi programmatori potrebbero beable di spiegare, quali sono i pro ei contro tra loro sono, e cosa ancora più importante, i motivi per cui vorrei utilizzare uno sopra l'altro?

È stato utile?

Soluzione

In poche parole: gli indici B-Tree prestazioni migliori, ma gli indici GiST sono più flessibili. Di solito, si vuole indici B-tree se lavoreranno per il tipo di dati. C'è stato un recente post sul PG elenca circa un enorme calo di prestazioni per l'utilizzo di indici GiST; ci si aspetta che sia più lento di B-Alberi (tale è il prezzo della flessibilità), ma non che molto più lento ... il lavoro è, come ci si potrebbe aspettare, in corso.

un post di Tom Lane ha , un nucleo di PostgreSQL sviluppatore:

  

Il principale punto di GIST è quello di essere in grado di query indice che semplicemente sono   Non indicizzabile in btree. ... Si potrebbe completamente   si aspettano btree di battere GIST per i casi btree indicizzabili. Penso che la   punto significativo è che è vincere con un fattore di una coppia   centinaio; che è abbastanza terribile, e potrebbe puntare a qualche implementazione   problema.

Altri suggerimenti

In sostanza il diritto di tutti - btree è indice di default come si comporta molto bene. GiST sono un po 'diverse bestie - è più di un "quadro di scrivere tipi di indice" di un tipo di indice da solo. È necessario aggiungere codice personalizzato (server) per usarlo, ma d'altra parte - sono molto flessibili

.

In generale - non si utilizza GiST a meno che il tipo di dati che si sta utilizzando ti dicono di fare così. Esempio di tipi di dati che utilizzano GiST:. Ltree (da contrib), tsvector (contrib / tsearch fino 8.2, a nucleo dal 8,3), e altri

V'è ben noto, e abbastanza veloce extenstion geografica per PostgreSQL - PostGIS ( http://postgis.refractions.net/ ) che utilizza GiST per i suoi scopi.

indici GiST sono lossy in una misura, il che significa che il DBMS deve fare i conti con i falsi positivi / negativi, cioè:.

  

indici GiST sono lossy perché ogni documento è rappresentato nell'indice da un fisso   firma lunghezza. La firma è   generato da hashing ogni parola in un   po 'casuale in una stringa di n-bit, con   tutti questi bit O-ed insieme a   produrre una firma documento n bit.   Quando due parole hash per lo stesso bit   posizione ci sarà una falsa partita.   Se tutte le parole nella query hanno corrispondenze   (Vero o falso) allora la riga della tabella   devono essere recuperate per vedere se la partita   è corretto.   b-alberi non hanno questo comportamento, così a seconda dei dati indicizzati, ci può essere una certa differenza di prestazioni tra i due.

Si veda per il comportamento di ricerca di testo http: //www.postgresql. org / docs / 8,3 / static / ricerca testuale-indexes.html e http://www.postgresql.org/docs/8.3/static/indexes-types.html per un confronto di uso generale.

GiST sono indici più generali. È possibile utilizzarli per scopi più ampi che quelli che si sarebbero utilizzabili con B-Tree. Tra cui la possibilità di costruire un B-Tree con GIST.

IE: è possibile utilizzare a Gist di indice su punti geografici, o aree geografiche, qualcosa che non sarà in grado di fare con gli indici B-Tree, dal momento che l'unica cosa che conta su un B-Tree è la chiave (o chiavi) si sta indicizzazione sui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top