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

Warum kommt der Planer zu unterschiedlichen Ergebnissen für Funktionen mit unterschiedlichen Volatilitäten?

Es werden 1000 Zeilen geschätzt

1000 Geschätzte Zeilen ist ein Standardwert, dokumentiert in CREATE FUNCTION :

Wenn eine Funktion als flüchtig deklariert wird, verlangt sie, dass sie nicht eingebettet wird, daher dieser Standardwert für result_rows hält.

Wenn es andererseits in eine Abfrage wie in Ihrem zweiten Test eingebettet wird, wird die Anzahl der Zeilen geschätzt, als ob der Hauptteil der Funktion in die Abfrage verschoben worden wäre und die Funktionsdeklaration nicht vorhanden wäre. Dies führt im zweiten Test zu einer exakten Schätzung seit den VALUES Klausel kann direkt ausgewertet werden.

Was genau macht der Planer hier und wo kann ich eine Dokumentation dazu lesen?

Im Allgemeinen werden die Optimierungsstrategien des Planers nicht in der Hauptdokumentation erläutert. Sie werden in Mailinglisten diskutiert und in den Kommentaren zum Quellcode erwähnt, die glücklicherweise tendenziell außergewöhnlich klar und gut geschrieben sind (im Vergleich zu durchschnittlichem Quellcode). Im Fall von Function Inlining glaube ich den Kommentaren von inline_set_returning_functions und inline_set_returning_function offenbaren die meisten Regeln, die diese spezielle Optimierung vorantreiben. (Warnung:Die obigen Links führen in den aktuellen Master-Zweig, der jederzeit geändert oder verschoben werden kann).