PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso usare un indice su una tabella partizionata in postgresql 8.3.7

Gli indici funzionano bene per eseguire una scansione solo delle partizioni rilevanti in PostgreSQL. Ma devi impostare tutto correttamente affinché funzioni ed è facile perdere un passaggio nel lungo elenco di cose documentate su http://www.postgresql.org/docs/current/static/ddl-partitioning.html

La cosa principale da capire è che per evitare una scansione sequenziale, devi fornire informazioni sufficienti a PostgreSQL in modo che possa provare che alcune partizioni non possono avere i dati che stai cercando; quindi vengono ignorati come potenziali origini per i risultati della query. L'articolo a cui ti colleghi lo indica come una soluzione al problema della scansione delle sequenze:"Se aggiungi vincoli di intervallo al campo della data di ciascuna partizione, questa query può essere ottimizzata in un ciclo in cui esegui prima una query sulla partizione "più recente" e funziona indietro finché non trovi un singolo valore superiore all'intervallo di tutte le partizioni rimanenti."--ma non mostra il piano migliorato che vedresti dopo quella modifica.

Alcuni errori comuni che potresti aver commesso:

-Il parametro constraint_exclusion nel file postgresql.conf è disattivato per impostazione predefinita. Con quell'impostazione predefinita, non otterrai ciò che ti aspetti.

-Non sono state create partizioni non sovrapposte utilizzando CHECK, che impedisce al pianificatore di sapere cosa c'è dentro ciascuna di esse. È possibile saltare questo passaggio ma continuare a trasferire correttamente i dati nelle partizioni corrette, il pianificatore semplicemente non lo saprà.

-Non ha inserito un indice su ogni partizione, ne ha creato solo uno sulla tabella principale. Questo ti darà una scansione sequenziale solo sulla partizione pertinente, quindi non così male come sopra ma nemmeno bene.

C'è del lavoro per rendere tutto più semplice nelle prossime versioni di PostgreSQL (l'impostazione di constraint_partition è abbastanza automatica in 8.4 e viene utilizzata una sorta di automazione dell'impostazione della partizione). In questo momento, se segui attentamente le istruzioni ed eviti tutti questi problemi, dovrebbe funzionare.