Cybertec
15.04.2019, 08:46 Uhr
Warum ist count in PostgreSQL langsam?
Viele Nutzer finden die Abfrage count in PostgreSQL langsam, insbesondere, wenn einfach nur alle Zeilen einer Tabelle gezählt werden sollen. Warum das so ist und was man dagegen machen kann, erklärt Laurenz Albe von Cybertec.
Wird mit SELECT count(*) FROM /* complicated query */; der Zählung aller Zeilen eine komplexe Abfrage vorausgeschickt, ist den meisten Anwendern klar, warum das Ergebnis auf sich warten lässt. Bei einer Abfrage über eine komplette Tabelle SELECT count(*) FROM large_table; verstehen viele nicht, warum das so lange dauert. Laurenz Albe erläutert in einem Beitrag auf der Seite cybertec warum das so ist und was man tun kann. Die Quintessenz seiner Ausführungen: PostgreSQL speichert die Zeilenzahl der Tabelle nicht, so dass bei einer Abfrage mit count(*) alle Zeilen durchlaufen werden müssen – und das dauert bei großen Tabellen. Das Speichern und permanente Aktualisieren von Infos über die Tabellengröße würde das Tempo aller anderen SQL-Befehle beeinträchtigen, so dass es Albe für keine gute Idee hält. Trotzdem listet Albe ein Skript, das diese Aufgabe übernehmen kann.
Außerdem weist er darauf hin, dass von so manchem Praktiker benutzte Tricks (etwa count(id)) zu fehlerhaften Ergebnissen führen können – im Beispiel count(id) werden nur Zeilen werden gezählt, für deren id gilt: IS NOT NULL. Für alle, denen eine Schätzung der Zeilenzahl genügt gibt's hier (nach unten scrollen) zudem ein 9-Zeilen-Skript, das diese Arbeit erledigt.