Wie kommt der PostgreSQL Planner zu seinen Annahmen?
Er nutzt die Einstellungen in der Konfigurationsdatei postgresql.conf. Eine der wichtigsten Einstellungen ist effective_cache_size, die angibt, wieviel RAM für eine Abfrage zur Verfügung steht. Anhand dieser Angabe "weiß" der Planner, wieviel Daten in den Speicher passen und wird seine Ausführungspläne daran orientieren. (Dieser Parameter dient dem Planner als Information und hat keine Auswirkungen auf die Zuteilung von Speicher.)
Der Standardwert für effective_cache_size = 128MB
Empfohlene Größe
PostgreSQL bis 8.1: bis zu 75% des verfügbaren RAM.
PostgreSQL 8.2: 25% des verfügbaren RAM
Wenn der Planner davon ausgehen kann, dass alle benötigten Daten im Speicher untergebracht werden können, wird er sich eher für einen Index-Scan entscheiden, wenn das nicht möglich ist, wird er einen Sequential-Scan ausführen.
Außerdem berücksichtigt der Planner die Gesamtzahl der Einträge in den Tabellen und Indexen sowie die Anzahl der Disk-Blocks, die von den einzelnen Tabellen und Indexen belegt werden. (relpages im Katalog pg_class). Anhand dieser Zahlen und den Statistiken im Katalog pg_statistic berechnet er die ungefähre Anzahl der Zeilen die jeder Zwischenschritt einer Abfrage zurückgibt, d.h., näherungsweise die Trefferrate eines jeden Ausdrucks in der WHERE-Klausel.
Die Statistiken werden mit ANALYZE, VACUUM ANALYZE oder vom autovacuum-Daemon aktualisiert. Daraus berechnet der Planner die ungefähren Kosten eines Ausführungsplan und kann sich für den effektivsten entscheiden.
Damit der Planner einigermaßen zuverlässige Annahmen treffen kann, ist es unbedingt notwendig, die Statistiken mit ANALYZE regelmäßig zu aktualisieren.
Bei Tabellen mit relativ statischem Inhalt ist die Ausführung von ANALYZE nicht so oft notwendig wie bei Tabellen, in die viel eingefügt, aktualisiert oder gelöscht wird.
Bei großen Tabellen betrachtet ANALYZE nicht den gesamten Inhalt der Tabelle, sondern nimmt einen zufällig generierten Durchschnitt der Daten als Grundlage. Wie viele Daten von ANALYZE herangezogen werden sollen, kann mit ALTER TABLE ... ALTER COLUMN ... SET STATISTICS bestimmt werden.
Für welchen Ausführungsplan der PostgreSQL-Planner sich entschieden hat, kann mit dem Kommando EXPLAIN in Erfahrung gebracht werden.