Indeksy działają dobrze, aby skanować tylko odpowiednie partycje w PostgreSQL. Ale musisz wszystko poprawnie skonfigurować, aby działało, i łatwo jest pominąć krok z długiej listy rzeczy udokumentowanych na http://www.postgresql.org/docs/current/static/ddl-partitioning.html
Najważniejszą rzeczą do zrealizowania jest to, że aby uniknąć skanowania sekwencyjnego, musisz dostarczyć wystarczająco dużo informacji do PostgreSQL, aby mógł udowodnić, że niektóre partycje nie mogą zawierać danych, których szukasz; następnie są pomijane jako potencjalne źródła wyników zapytania. Artykuł, do którego odsyłasz, wskazuje to jako rozwiązanie problemu skanowania sekwencji:„Jeśli dodasz ograniczenia zakresu do pola daty każdej partycji, zapytanie to może zostać zoptymalizowane w pętlę, w której najpierw odpytujesz „najnowszą” partycję i działasz wstecz, aż znajdziesz pojedynczą wartość, która jest wyższa niż zakres wszystkich pozostałych partycji."--ale nie pokazuje ulepszonego planu, który zobaczysz po tej zmianie.
Kilka typowych błędów, które mogłeś popełnić:
-Parametr bound_exclusion w pliku postgresql.conf jest domyślnie wyłączony. Przy takim ustawieniu domyślnym nie uzyskasz tego, czego oczekujesz.
— Nie utworzono nienakładających się partycji za pomocą funkcji CHECK, co uniemożliwia planistom poznanie zawartości każdej z nich. Możliwe jest pominięcie tego kroku, ale nadal prawidłowo przenosisz dane na odpowiednie partycje, planista po prostu o tym nie wie.
-Nie umieścił indeksu na każdej partycji, utworzył tylko jeden w tabeli głównej. To da ci sekwencyjne skanowanie tylko na odpowiedniej partycji, więc nie tak złe, jak powyżej, ale też nie dobre.
Jest trochę pracy, aby to wszystko ułatwić w nadchodzących wydaniach PostgreSQL (ustawienie bound_partition jest dość automatyczne w wersji 8.4 i pracuje się nad pewnym rodzajem automatyzacji konfiguracji partycji). W tej chwili, jeśli będziesz uważnie postępować zgodnie z instrukcjami i unikniesz wszystkich tych problemów, powinno to zadziałać.