Indexen werken prima om alleen de relevante partities in PostgreSQL te scannen. Maar je moet alles goed instellen om het te laten werken, en het is gemakkelijk om een stap te missen in de lange lijst met dingen die zijn gedocumenteerd op http://www.postgresql.org/docs/current/static/ddl-partitioning.html
Het belangrijkste om te beseffen is dat om een sequentiële scan te vermijden, u voldoende informatie aan PostgreSQL moet verstrekken zodat het kan bewijzen dat sommige partities niet de gegevens kunnen hebben waarnaar u op zoek bent; dan worden ze overgeslagen als potentiële bronnen voor de queryresultaten. Het artikel waarnaar u linkt, wijst hierop als een oplossing voor het seq-scanprobleem:"Als u bereikbeperkingen toevoegt aan het datumveld van elke partitie, kan deze query worden geoptimaliseerd tot een lus waarin u eerst de "nieuwste" partitie opvraagt en achteruit totdat u een enkele waarde vindt die hoger is dan het bereik van alle resterende partities."--maar toont niet het verbeterde plan dat u na die wijziging zou zien.
Enkele veelvoorkomende fouten die u mogelijk heeft gemaakt:
-De parameter constraint_exclusion in het bestand postgresql.conf is standaard uitgeschakeld. Met die standaard krijg je niet wat je verwacht.
- Geen niet-overlappende partities gemaakt met CHECK, waardoor de planner niet weet wat er in elk van hen zit. Het is mogelijk dat u deze stap overslaat, maar toch uw gegevens op de juiste manier in de juiste partities krijgt, dat weet de planner gewoon niet.
-Heeft geen index op elke partitie gezet, alleen een gemaakt op de hoofdtabel. Dit geeft je een sequentiële scan alleen op de relevante partitie, dus niet zo slecht als het bovenstaande, maar ook niet goed.
Er is wat werk aan de winkel om dit allemaal gemakkelijker te maken in aankomende PostgreSQL-releases (het instellen van constraint_partition is redelijk automatisch in 8.4 en er wordt gewerkt aan een soort automatisering van het instellen van partities). Als je nu de instructies zorgvuldig opvolgt en al deze problemen vermijdt, zou het moeten werken.