sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur kan jag använda ett index på en partitionerad tabell i postgresql 8.3.7

Index fungerar alldeles utmärkt för att endast skanna de relevanta partitionerna i PostgreSQL. Men du måste ställa in allt ordentligt för att det ska fungera, och det är lätt att missa ett steg i den långa listan med saker som finns dokumenterade på http://www.postgresql.org/docs/current/static/ddl-partitioning.html

Det viktigaste att inse är att för att undvika en sekventiell genomsökning måste du tillhandahålla tillräckligt med information till PostgreSQL så att det kan bevisa att vissa partitioner inte kan ha den data du letar efter; sedan hoppas de över som potentiella källor för frågeresultaten. Artikeln du länkar till pekar ut detta som en lösning på seq scan-problemet:"Om du lägger till intervallbegränsningar till datumfältet för varje partition, kan denna fråga optimeras till en loop där du frågar den "senaste" partitionen först och arbetar baklänges tills du hittar ett enda värde som är högre än intervallet för alla återstående partitioner."--men visar inte den förbättrade planen du skulle se efter den ändringen.

Några vanliga misstag du kan ha gjort:

- Parametern constraint_exclusion i postgresql.conf-filen är avstängd som standard. Med den standardinställningen får du inte vad du förväntar dig.

-Skapade inte icke-överlappande partitioner med CHECK, vilket hindrar planeraren från att veta vad som finns inuti var och en av dem. Det är möjligt att missa det här steget men ändå få in din data till rätt partitioner på rätt sätt, planeraren vet helt enkelt inte det.

-Sätte inte ett index på varje partition, skapade bara ett på mastertabellen. Detta kommer att ge dig en sekventiell skanning bara på den relevanta partitionen, så inte lika dålig som ovan men inte heller bra.

Det finns en del arbete för att göra detta enklare i kommande PostgreSQL-utgåvor (inställningen av constraint_partition är ganska automatisk i 8.4 och någon slags partitionsinställningsautomatisering arbetar i). Just nu, om du följer instruktionerna noggrant och undviker alla dessa problem, borde det fungera.




  1. Laravel:Hur man får anpassad sorterad vältalig samling med whereIn-metoden

  2. Hur tar man bort varje post efter den n:e raden i mysql?

  3. Mysql kastar undantag på Regex

  4. Markera för att infoga eller uppdatera tabell