1

Gibt es einen Unterschied? Ich weiß, dass SQL-Abfragen ihre Ausführungspläne genauso gut im Cache speichern lassen wie Funktionen.PostgreSQL-Leistung von Ad-hoc SQL vs Funktionen

foud I someone telling:

Leistung ist ein Problem, und wir vermuten Abfrage Planung könnte eine zugrunde liegende Ursache sein. Ich habe die Skripte von Ad-hoc-SQL zu einem Postgres-Funktionen (CREATE FUNCTION) umgeschrieben und wir sahen Serverlast gehen ziemlich runter.

Aber warum?

Antwort

1

Der Abfrageplan für Ad-hoc-Abfragen ist nicht zwischengespeichert, nur für prepared statements. Und PL/pgSQL-Funktionen behandeln alle SQL-Anweisungen wie vorbereitete Anweisungen intern. (Mit der bemerkenswerten Ausnahme von dynamischem SQL mit EXECUTE.) Jeder für den Bereich der aktuellen Sitzung, nicht darüber hinaus.

So PL/pgSQL Funktionen (nicht SQL-Funktionen!) Können mit der wiederholten Ausführung von anspruchsvollen Abfragen innerhalb der gleichen Sitzung helfen. Genau wie vorbereitete Aussagen.

Die Client-Software verwendet standardmäßig vorbereitete Anweisungen. Oder die "extended query" protocol, um den gleichen Effekt.

Verwandte:

Die entsprechende Antwort, die the thread on pgsql-general gestartet, Sie beziehen sich auf:

auch co nsider das Kapitel Plan Caching für PL/pgSQL im Handbuch.

+0

Mir wurde gesagt, dass Abfragen ihres Ausführungsplan [hier] (https://stackoverflow.com/questions/46677509/postgresql-function-execution-plan-cache-principle/46678190?noredirect=1#comment80305222_46678190) –

+0

Im Cache @ YevgeniyAfanasyev: Das ist ein Missverständnis. Der Abfrageplan für Ad-hoc-SQL-Anweisungen wird nicht zwischengespeichert. Nur für vorbereitete Aussagen. –

+0

Rechts. Ich ging davon aus, dass Sie vorbereitete Anweisungen verwenden, denn wenn Sie sich über die Einzelheiten darüber Gedanken machten, wie Pläne in Funktionen usw. zwischengespeichert werden, hätten Sie dies bereits als ersten Schritt zur Senkung der Planungskosten getan. Wenn die aufgerufene Funktion eine inlineable SQL-Funktion ist, könnte sie auch indirekt beim Aufrufen von plpgsql-Funktionen zwischengespeichert werden. –