PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich einen Index für eine partitionierte Tabelle in postgresql 8.3.7 verwenden

Indizes funktionieren einwandfrei, um nur die relevanten Partitionen in PostgreSQL zu scannen. Aber Sie müssen alles richtig einrichten, damit es funktioniert, und es ist leicht, einen Schritt in der langen Liste von Dingen zu übersehen, die unter http://www.postgresql.org/docs/current/static/ddl-partitioning.html

Das Wichtigste ist, dass Sie PostgreSQL genügend Informationen zur Verfügung stellen müssen, um einen sequentiellen Scan zu vermeiden, damit es beweisen kann, dass einige Partitionen die gesuchten Daten nicht enthalten können. dann werden sie als potenzielle Quellen für die Abfrageergebnisse übersprungen. Der Artikel, auf den Sie verlinken, weist darauf als Lösung für das Seq-Scan-Problem hin:„Wenn Sie dem Datumsfeld jeder Partition Bereichseinschränkungen hinzufügen, kann diese Abfrage in eine Schleife optimiert werden, in der Sie zuerst die „neueste“ Partition abfragen und arbeiten rückwärts, bis Sie einen einzelnen Wert finden, der höher ist als der Bereich aller verbleibenden Partitionen."--zeigt aber nicht den verbesserten Plan, den Sie nach dieser Änderung sehen würden.

Einige häufige Fehler, die Sie möglicherweise gemacht haben:

-Der Parameter „constraint_exclusion“ in der Datei „postgresql.conf“ ist standardmäßig deaktiviert. Mit dieser Standardeinstellung erhalten Sie nicht das, was Sie erwarten.

- Keine nicht überlappenden Partitionen mit CHECK erstellt, wodurch der Planer nicht weiß, was sich in jeder von ihnen befindet. Es ist möglich, diesen Schritt zu überspringen, aber Ihre Daten trotzdem richtig in die richtigen Partitionen zu bekommen, der Planer wird das einfach nicht wissen.

- Hat nicht jeder Partition einen Index hinzugefügt, sondern nur einen in der Master-Tabelle erstellt. Dadurch erhalten Sie einen sequentiellen Scan nur auf der relevanten Partition, also nicht so schlecht wie oben, aber auch nicht gut.

Es gibt einige Arbeiten, um dies alles in kommenden PostgreSQL-Releases zu vereinfachen (das Festlegen von Constraint_Partition ist in 8.4 ziemlich automatisch und es wird an einer Art Partitions-Setup-Automatisierung gearbeitet). Wenn Sie die Anweisungen genau befolgen und all diese Probleme vermeiden, sollte es jetzt funktionieren.