sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik een index gebruiken op een gepartitioneerde tabel in postgresql 8.3.7

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.




  1. Reset automatische ophogingsteller in postgre

  2. PostgreSQL:Het gebruik van de EN-instructie in LEFT JOIN werkt niet zoals verwacht

  3. Kan geen verbinding maken met Oracle DB en krijg fout als java.sql.SQLException:Io-uitzondering:de netwerkadapter kan geen verbinding tot stand brengen

  4. Hoe krijg je een maximum voor een veld op basis van een datum en krijg je ook andere velden?