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

Postgres che combina più indici

Non so se Pg possa combinare un indice GiST e indici b-tree regolari con una scansione dell'indice bitmap, ma sospetto di no. Potresti ottenere il miglior risultato possibile senza aggiungere un user_id colonna al tuo indice GiST (e di conseguenza rendendolo più grande e più lento per altre query che non utilizzano user_id ).

Come esperimento potresti:

CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);

che è probabile che si traduca in un grande indice, ma potrebbe aumentare quella query, se funziona. Tieni presente che il mantenimento di un tale indice rallenterà notevolmente INSERT e UPDATE S. Se elimini il vecchio ix_coords le tue query utilizzeranno ix_coords_and_user_id anche se non filtrano su user_id , ma sarà più lento di ix_coords . Mantenendo entrambi verrà visualizzato il INSERT e UPDATE rallentamento ancora peggio.

Vedi btree-gist

(Obsoleto dalla modifica alla domanda che cambia completamente la domanda; quando l'utente aveva scritto un indice multicolonna, ora è stato diviso in due separati ):

Sembra che tu non stia filtrando o ordinando su user_id , solo create_date . Pg non utilizzerà (non può?) utilizzare solo il secondo termine di un indice a più colonne come (user_id, create_date) , è necessario utilizzare anche il primo elemento.

Se vuoi indicizzare create_date , crea un indice separato per esso. Se usi e hai bisogno del (user_id, create_date) index e generalmente non utilizzare solo user_id da solo, vedi se riesci a invertire l'ordine delle colonne. In alternativa, crea due indici indipendenti, (user_id) e (create_date) . Quando sono necessarie entrambe le colonne, Pg può combinare i due indici indipendenti utilizzando una scansione dell'indice bitmap.