6

delayed_job robi zapytanie tak regularnie:Jaki jest najbardziej optymalny indeks dla tego zapytania delayed_job na postgresie?

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 

Moje logi na mojej dość dużym raporcie maszynowego DB, że zabierze ćwierć sekundy do uruchomienia. Mogę po prostu rzucić niektóre indeksy na wszystkich kolumnach, które są wybrane, ale prawdopodobnie mogę uzyskać większą wydajność z indeksu wielu kolumn.

Jaki jest najbardziej optymalny indeks dla wielu kolumn, które mogę utworzyć dla tego zapytania? Czy są jakieś narzędzia, które mogą mi to obliczyć? Wersja

aktualizacja

postgres: 9.1.3

jeden istniejący indeks: priorytet, run_at (o nazwie "delayed_jobs_priority")

z 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

Czy istnieją jakieś indeksy? – swasheck

+1

Jaki jest obecny plan wyjaśnień i jaka wersja PG jest włączona? – Kuberchaun

+0

@JustBob i dodałem tę informację do mojego pytania teraz –

Odpowiedz

0

I nie sądzę, aby indeks wielolumnowy był w tym przypadku bardzo przydatny. Użyj wielu indeksów pojedynczej kolumny.

1

Ponieważ masz klauzulę LIMIT, możliwe, że chcesz zamówić indeks zamiast filtrującego, na (priority, run_at).

Jaki jest procent zapisów w tabeli, które spełniają warunek WHERE?

+0

Plan przewiduje 10 krotek dla skanowania indeksu, ale statystyki mogą być błędne. – wildplasser

+0

@Quassnoi zwykle bardzo małe –