6

delayed_job fa una query come con frequenza:Qual è l'indice più ottimale per questa query delayed_job su postgres?

SELECT "delayed_jobs".* 
FROM "delayed_jobs" 
WHERE ((run_at <= '2012-05-23 15:16:43.180810' AND (locked_at IS NULL OR locked_at < '2012-05-23 11:16:43.180841') OR locked_by = 'host:foo pid:1') AND failed_at IS NULL) 
ORDER BY priority ASC, run_at ASC LIMIT 5 

miei log sul mio rapporto abbastanza grande macchina DB che ci vuole un secondo trimestre per l'esecuzione. Potrei semplicemente gettare alcuni indici su tutte le colonne selezionate, ma probabilmente posso ottenere più risultati da un indice a più colonne.

Qual è l'indice multi-colonna ottimale che posso fare per questa query? Ci sono strumenti che possono calcolare questo per me?

aggiornamento

Postgres versione: 9.1.3

uno esistente indice: la priorità, run_at (chiamato "delayed_jobs_priority")

fuori explain analyze:

Limit (cost=0.00..219.65 rows=5 width=1154) (actual time=0.727..0.727 rows=0 loops=1) 
    -> Index Scan using delayed_jobs_priority on delayed_jobs (cost=0.00..351.43 rows=8 width=1154) (actual time=0.725..0.725 rows=0 loops=1) 
     Filter: ((failed_at IS NULL) AND (((run_at <= '2012-05-23 18:11:03.980113'::timestamp without time zone) AND ((locked_at IS NULL) OR (locked_at < '2012-05-23 14:11:03.98014'::timestamp without time zone))) OR ((locked_by)::text = 'host:foo pid:1'::text))) 
Total runtime: 0.754 ms 
(4 rows) 
+0

Esistono indici esistenti? – swasheck

+1

Qual è il piano di spiegazioni corrente e su quale versione di PG sei? – Kuberchaun

+0

@JustBob ho aggiunto queste informazioni alla mia domanda ora –

risposta

0

I non credo che un indice a più colonne sia molto utile in questo caso. Utilizza più indici a colonna singola.

1

Dato che si ha una clausola LIMIT, è possibile che si desideri un indice di ordinamento invece di uno filtrante, su (priority, run_at).

Qual è la percentuale di record nella tabella che soddisfano la condizione WHERE?

+0

Il piano prevede 10 tuple per la scansione dell'indice, ma le statistiche potrebbero essere errate. – wildplasser

+0

@Quassnoi di solito molto piccolo –

Problemi correlati