PostgreSQL hat keine "Cache" -Optimierung im Sinne eines Abfrageergebnis-Cache.
Es tut Cache-Tabellenblöcke, die kürzlich in shared_buffers
gelesen wurden, aber für die meisten Installationen, die nur einen kleinen Effekt hat. Der Hauptcache ist der Disk Read Cache des Betriebssystems. Für weitere Informationen siehe:
See and clear Postgres caches/buffers?
Es klingt für mich wie Sie ein System mit einer angemessenen Menge an RAM und einer schnellen CPU, sondern eine schrecklich langsam Platte. Daher sind Abfragen, die nur den Festplatten-Cache des Betriebssystems betreffen, sehr schnell, aber Abfragen, die auf die Festplatte gehen, benötigen ein paar Sekunden, um die Daten einzulesen. Daher sind Caching-Effekte sehr stark.
Sie sollten explain (buffers, analyze, verbose) SELECT ...
Ihre Abfragen. Versuchen Sie es mit ein paar verschiedenen Eingabewerten, bis Sie eine langsame erhalten. Pläne vergleichen.
Wenn die Pläne die gleichen sind, ist es wahrscheinlich.
Wenn die Pläne anders sind, treffen Sie wahrscheinlich eine Situation, in der der Abfrageplaner basierend auf Variationen in den Tabellenstatistiken falsche Entscheidungen trifft. Das Erhöhen der Statistikziele für die interessierenden Spalten kann hilfreich sein (siehe Handbuch). Wenn du andere Pläne hast und feststeckst/Hilfe brauchst, kannst du eine neue Frage auf dba.stackexchange.com mit Details posten.
Ich denke, Sie können davon ausgehen, dass das zweite Ergebnis realistischer als das erste ist. – klin
Nun, in der Theorie nehme ich an, dass x, y, Azimut in jeder Abfrage unterschiedlich sein wird, weil es sehr anders ist als ein zweiter Benutzer die exakten Werte eingibt. Also ich denke, der erste Wert ist der Realist. Jedenfalls, wenn ich den Code in der Funktion ändere, muss ich alle Tests mehrmals ausführen, um sicherzustellen, dass man den Durchschnittswert hat. –
Als ich bei Postgres nichttriviale Tests machte, erfuhr ich, dass die Standardabweichung des ersten Ergebnisses fast immer die größte war. Daher akzeptierte ich den Grundsatz, das erste Ergebnis zu überspringen. Ich denke, du musst deine Funktion mit zufälligen Argumenten testen. – klin