2013-01-31 14 views
7

Potrzebujesz pomocy dotyczącej wydajności zapytania w PostgreSQL. Wydaje się, że odnosi się do indeksów.Nieregularna indeksowana wydajność zapytań w PostgreSQL

Zapytanie:

  • filtrów według type
  • zarządzenia timestamp, rosnąco:

SELECT * FROM the_table WHERE type = 'some_type' ORDER BY timestamp LIMIT 20

Indeksy:

CREATE INDEX the_table_timestamp_index ON the_table(timestamp); 

CREATE INDEX the_table_type_index ON the_table(type); 

Wartości pola type to tylko jeden z około 11 różnych ciągów.
Problem polega na tym, że kwerenda wydaje się wykonywać w czasie O (log n), zajmując tylko kilka milisekund najwięcej razy, z wyjątkiem niektórych wartości type, które wykonują kilka minut.

W tych przykładowych pytań, pierwszy trwa zaledwie kilka milisekund, aby uruchomić podczas gdy druga zajmuje ponad 30 minut:

SELECT * FROM the_table WHERE type = 'goq' ORDER BY timestamp LIMIT 20 
SELECT * FROM the_table WHERE type = 'csp' ORDER BY timestamp LIMIT 20 

podejrzewam, ze około 90% pewności, że indeksy mamy nie są właściwe. Myślę, że po przeczytaniu this similar question about index performance, najprawdopodobniej potrzebujemy indeksu złożonego, ponad type i timestamp.

Zapytanie planuje, że mam uruchomić tu:

  1. Expected performance, type-specific index (i.e. new index with the type = 'csq' in the WHERE clause).
  2. Slowest, problematic case, indexes as described above.
  3. Fast case, same indexes as above.

Dziękuję bardzo za pomoc! Wszelkie wskazówki będą naprawdę mile widziane!

+0

Jaki jest rozmiar indeksów? A rozmiar zestawu danych? – Gothmog

Odpowiedz

2

Indeksy mogą być używane w klauzuli where lub klauzuli order by. Z indeksem thetable(type, timestamp), ten sam indeks może być użyty dla obu.

Domyślam się, że Postgres decyduje, który indeks użyć na podstawie zebranych statystyk. Kiedy używa indeksu do miejsca, a następnie próbuje sortować, dostajesz naprawdę złą wydajność.

To tylko przypuszczenie, ale warto utworzyć powyższy indeks, aby sprawdzić, czy to rozwiązuje problemy z wydajnością.

+0

Dzięki! Spróbuję :) –

2

Wszystkie wyniki wyjaśniania używają indeksu znacznika czasu. Jest tak prawdopodobnie dlatego, że liczność kolumny typu jest zbyt mała, więc skanowanie indeksu na tej kolumnie jest tak kosztowne, jak skanowanie tabeli.

Indeks kompozytowy być tworzone powinny być:

create index comp_index on the_table ("timestamp", type) 

w tej kolejności.

+0

Awesome! Czy jest różnica między kolejnością kolumn w indeksie? –

+0

@JuanCarlosCoto. . . W rzeczywistości kolejność robi różnicę. Przez wstawienie 'timestamp' najpierw silnik nie może użyć indeksu dla klauzuli' where'. Różne typy będą rozproszone w całym indeksie. –

Powiązane problemy