sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan kan jeg bruge et indeks på en partitioneret tabel i postgresql 8.3.7

Indekser fungerer fint til kun at scanne de relevante partitioner i PostgreSQL. Men du skal konfigurere alt korrekt, for at det fungerer, og det er nemt at gå glip af et trin i den lange liste over ting, der er dokumenteret på http://www.postgresql.org/docs/current/static/ddl-partitioning.html

Det vigtigste at indse er, at for at undgå en sekventiel scanning, skal du give nok information til PostgreSQL, så det kan bevise, at nogle partitioner ikke kan have de data, du leder efter; så springes de over som potentielle kilder til forespørgselsresultaterne. Artiklen, du linker til, påpeger dette som en løsning på seq-scanningsproblemet:"Hvis du tilføjer interval-begrænsninger til datofeltet for hver partition, kan denne forespørgsel optimeres til en løkke, hvor du forespørger på den "seneste" partition først og arbejder baglæns, indtil du finder en enkelt værdi, der er højere end intervallet for alle de resterende partitioner."--men viser ikke den forbedrede plan, du ville se efter den ændring.

Nogle almindelige fejl, du måske har lavet:

-Constraint_exclusion-parameteren i postgresql.conf-filen er deaktiveret som standard. Med den standard får du ikke, hvad du forventer.

-Oprettede ikke ikke-overlappende partitioner ved hjælp af CHECK, hvilket forhindrer planlæggeren i at vide, hvad der er inde i hver af dem. Det er muligt at gå glip af dette trin, men stadig få dine data ind i de rigtige partitioner korrekt, det ved planlæggeren bare ikke.

-Lavede ikke et indeks på hver partition, kun oprettede et på mastertabellen. Dette vil give dig en sekventiel scanning kun på den relevante partition, så ikke så dårlig som ovenstående, men heller ikke god.

Der er noget arbejde for at gøre det hele lettere i kommende PostgreSQL-udgivelser (indstilling af constraint_partition er ret automatisk i 8.4, og der arbejdes på en slags partitionsopsætningsautomatisering). Lige nu, hvis du følger instruktionerne omhyggeligt og undgår alle disse problemer, burde det virke.




  1. ROW_NUMBER() i MySQL

  2. Få ubrugte unikke værdier på en SQL-tabel

  3. Hvordan finder man eksistensen af ​​.Net Framework Data Provider til MySql på Mono Ubuntu?

  4. MySqlException:Timeout udløb - Øget forbindelsestimeout har ingen effekt