2015-03-10 1 views
18

Sto implementando una tabella che ha una colonna con un tipo di dati tsvector e sto cercando di capire quale indice sarebbe meglio usare?Differenza tra indice GiST e GIN

GIN o GiST?

Guardando attraverso il postgres documentation here mi sembra di ottenere che:

  • GiST è più veloce per aggiornare e costruire l'indice e meno preciso di gin.

  • GIN è più lento per aggiornare e creare l'indice ma è più preciso.

OK, quindi perché qualcuno vorrebbe un campo indice indicizzato sul gin? Se l'essenza potrebbe darti dei risultati sbagliati? Ci deve essere qualche vantaggio (prestazioni al di fuori) su questo.

Qualcuno può spiegare in parole povere quando vorrei utilizzare GIN vs. GiST?

+0

* Sempre * fornire la versione di Postgres. GIN ha ricevuto importanti miglioramenti in Postgres 9.4 –

risposta

31

Non credo che avrei potuto spiegarlo meglio di the manual già fa:

Nel scelta di quale tipo di indice da utilizzare, il GIST o GIN, prendere in considerazione queste differenze prestazioni:

  • Le ricerche dell'indice GIN sono circa tre volte più veloci di GiST

  • Gli indici GIN impiegano circa tre volte di più rispetto a GiST

  • indici GIN sono moderatamente più lento da aggiornare rispetto indici GiST, ma circa 10 volte più lento se il supporto rapido aggiornamento è stato disattivato [...]

  • indici GIN sono due a tre volte più grande di GiST indici

il link è al corrente manuale , la citazione è dalla versione per 9,4, mentre il link è alla versione 9.1 (per qualche motivo?).

Le stime di dimensioni e prestazioni sembrano leggermente superate nel manuale e sono state rimosse.
With Postgres 9.4 the odds have shifted substantially in favor of GIN.
Il release notes of Postgres 9.4 includono:

  • ridurre le dimensioni di indice GIN (Alexander Korotkov, Heikki Linnakangas) [...]

  • migliorare la velocità di ricerche GIN multi-chiave (Alexander Korotkov, Heikki Linnakangas)

noti che ci sono special use cases che richiedono l'uno o l'altro.

Una cosa che frainteso: è mai ottenere risultati errati con un indice di GIST. L'indice funziona su valori hash, che possono portare a falsi positivi nell'indice. Questo dovrebbe diventare rilevante solo con un numero molto grande di parole diverse nei tuoi documenti. I falsi positivi vengono eliminati dopo aver ricontrollato la riga effettiva in ogni caso. The manual:

Un indice GiST è lossy, il che significa che l'indice può produrre falsi partite, ed è necessario controllare la riga della tabella effettiva eliminare tali false corrispondenze. (PostgreSQL fa automaticamente quando necessario.)

grassetto corsivo mio.

+0

Credo tu intendessi "Non si ottengono mai risultati errati con un indice GIN", giusto? – IamIC

+0

@IamIC: non si ottengono mai risultati errati con GIN o GiST. Ma sto affrontando specificamente GiST nella risposta perché l'OP ha avuto un'impressione sbagliata lì. –

+0

Capito. Ciò ha senso. – IamIC