6

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) 
+0

Gibt es vorhandene Indizes? – swasheck

+1

Was ist der aktuelle EXPLAIN-Plan und welche Version von PG sind Sie? – Kuberchaun

+0

@JustBob Ich habe diese Information jetzt zu meiner Frage hinzugefügt –

Antwort

0

I glaube nicht, dass ein mehrspaltiger Index in diesem Fall von großem Nutzen ist. Verwenden Sie mehrere einzelne Spaltenindizes.

1

Da Sie eine LIMIT-Klausel haben, ist es möglich, dass Sie einen Ordnungsindex anstelle einer Filterung unter (priority, run_at) möchten.

Wie groß ist der Prozentsatz der Datensätze in Ihrer Tabelle, die die Bedingung WHERE erfüllen?

+0

Der Plan erwartet 10 Tupel für den Index Scan, aber die Statistiken können falsch sein. – wildplasser

+0

@ Quassnoi normalerweise sehr klein –