Domanda

Ho una tabella T con una colonna C, che è un INT e ha un indice BTREE su di essa.

Perché la seguente query non utilizza questo indice?

explain select c from t group by c;

Il risultato che ottengo è:

HashAggregate  (cost=1005817.55..1005817.71 rows=16 width=4)
  ->  Seq Scan on t  (cost=0.00..946059.84 rows=23903084 width=4)

La mia comprensione degli indici è limitata, ma ho pensato che tali domande fossero lo scopo degli indici.

È stato utile?

Soluzione

La query può certamente usare un indice. Il motivo per cui non è nel tuo caso particolare dipende dalle dimensioni e dalla distribuzione particolari dei dati. Puoi usare SET enable_seqscan TO off investigare.

Altri suggerimenti

Questa query può essere eseguita utilizzando un'ottimizzazione chiamata a Scansione indice allentata. Tuttavia PostgreSQL non implementa ancora questa ottimizzazione, quindi utilizza invece una scansione della tabella.

Dei principali database, per quanto ne so solo MySQL ha implementato scansione indice sciolta (Forse anche Oracle?). Postgresql non l'ha fatto implementato questa funzione.

Perché richiede la scansione dell'intera tabella, quindi farlo tramite l'indice non ha alcun vantaggio. (Gli "indici di copertura" non sono utili come tecnica di prestazione in PostgreSQL a causa della sua implementazione MVCC).

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