delayed_job hace una consulta como la siguiente regularidad:¿Cuál es el índice más óptimo para esta consulta de retraso de trabajo en 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
Mis registros en mi informe bastante grande máquina de base de datos que se necesita un cuarto de segundo para funcionar. Podría simplemente lanzar algunos índices en todas las columnas que están seleccionadas, pero probablemente pueda obtener más rendimiento de un índice de varias columnas.
¿Cuál es el índice más óptima de varias columnas que puedo hacer para esta consulta? ¿Hay alguna herramienta que pueda calcular esto para mí?
actualización
postgres versión: 9.1.3
existente índice: prioridad, run_at (llamado "delayed_jobs_priority")
de 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)
¿Hay algún índice existente? – swasheck
¿Cuál es el plan de explicación actual y en qué versión de PG está usted? – Kuberchaun
@JustBob i añadió esta información a mi pregunta ahora –