Właśnie dokonałem restrukturyzacji bazy danych, aby korzystać z partitioning w Postgresie 8.2. Teraz mam problem z wydajnością zapytań:Wydajne sprawdzanie tablicy Postgres z wieloma partycjami
SELECT *
FROM my_table
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100;
Istnieje 45 milionów wierszy w tabeli. Przed przystąpieniem do partycjonowania używałby skanowania wstecznego indeksu i zatrzymania, gdy tylko osiągnie limit.
Po partycjonowaniu (w zakresach time_stamp), Postgres wykonuje pełne skanowanie indeksu tabeli głównej i odpowiedniej partycji i łączy wyniki, sortuje je, a następnie stosuje limit. To trwa zbyt długo.
mogę go naprawić z:
SELECT * FROM (
SELECT *
FROM my_table_part_a
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
SELECT * FROM (
SELECT *
FROM my_table_part_b
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
... and so on ...
ORDER BY id DESC
LIMIT 100
ten przebiega szybko. Partycje, w których znaczniki czasu są poza zasięgiem, nie są nawet uwzględniane w planie zapytania.
Moje pytanie brzmi: czy jest jakaś podpowiedź lub składnia, której mogę użyć w Postgresie 8.2, aby uniemożliwić programowi planowania zapytań skanowanie pełnej tabeli, ale nadal używając prostej składni, która odnosi się tylko do tabeli głównej?
Zasadniczo, czy mogę uniknąć bólu związanego z dynamicznym budowaniem dużego zapytania UNION przez każdą z partycji, która ma być aktualnie zdefiniowana?
EDIT: Mam constraint_exclusion włączona (dzięki @Vinko Vrsalovic)
8.2? naprawdę? Przed zrobieniem czegokolwiek, powinieneś rozważyć uaktualnienie do obsługiwanej (i aktualnej) wersji PostgreSQL (aktualna jest wersja 9.2). –