delayed_job funktioniert eine Abfrage wie folgt regelmäßig:Was ist der optimale Index für diese delayed_job-Abfrage auf 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
Meine Protokolle auf meine ziemlich großen Bericht DB-Maschine, dass sie eine Viertelsekunde ausgeführt dauert. Ich könnte nur einige Indizes für alle Spalten werfen, die ausgewählt sind, aber ich kann wahrscheinlich mehr Leistung aus einem mehrspaltigen Index erhalten.
Was ist der optimale mehrspaltige Index, den ich für diese Abfrage erstellen kann? Gibt es irgendwelche Werkzeuge, die das für mich berechnen können?
Update
Postgres Version: 9.1.3
einen bestehenden Index: Priorität, run_at ("delayed_jobs_priority" genannt)
aus 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)
Gibt es vorhandene Indizes? – swasheck
Was ist der aktuelle EXPLAIN-Plan und welche Version von PG sind Sie? – Kuberchaun
@JustBob Ich habe diese Information jetzt zu meiner Frage hinzugefügt –