Supponendo di avere a che fare con un tavolone , un indice parziale potrebbe aiutare:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;
Come hai già scoperto:discendente o ascendente qui non importa. Postgres può eseguire la scansione all'indietro quasi alla stessa velocità (si applicano eccezioni con indici a più colonne).
Interroga per utilizzare questo indice:
SELECT * FROM tbl
WHERE created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER BY created_at DESC
LIMIT 1;
Il punto qui è rendere l'indice molto più piccolo , quindi dovrebbe essere più facile memorizzare nella cache e mantenere.
- Devi scegliere un timestamp che sia sicuramente inferiore a quello più recente.
- Di tanto in tanto dovresti ricreare l'indice per tagliare i vecchi dati.
- La condizione deve essere
IMMUTABLE
.
Quindi l'effetto una tantum si deteriora nel tempo. Il problema specifico è la condizione hardcoded:
WHERE created_at > '2013-09-15 0:0'::timestamp
Automatizzare
Di tanto in tanto potresti aggiornare manualmente l'indice e le tue query. Oppure lo automatizzi con l'aiuto di una funzione come questa:
CREATE OR REPLACE FUNCTION f_min_ts()
RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$
Indice:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();
Domanda:
SELECT * FROM tbl
WHERE created_at > f_min_ts()
ORDER BY created_at DESC
LIMIT 1;
Automatizza la ricreazione con un cron job o qualche evento basato su trigger. Le tue domande possono rimanere le stesse ora. Ma devi ricreare tutti gli indici utilizzare in alcun modo questa funzione dopo averla modificata. Basta rilasciare e creare ciascuno di essi.
Prima ..
... verifica se stai effettivamente colpendo il collo di bottiglia con questo.
Prova se un semplice DROP index ... ; CREATE index ...
fa il lavoro. Quindi il tuo indice potrebbe essere stato gonfio. Le tue impostazioni di autovuoto potrebbero essere disattivate.
Oppure prova VACUUM FULL ANALYZE
per avere l'intera tabella più gli indici in ottime condizioni e ricontrollare.
Altre opzioni includi la consueta ottimizzazione generale delle prestazioni e gli indici di copertura, a seconda di ciò che effettivamente recuperi dalla tabella.