Library Cache bei PostgreSQL?

Hallo Forum.
Ich habe eine, für Euch bestimmt einfache Frage. In Oracle beinhaltet der Shared Pool u.a. den Library Cache. Darin werden fertig geparste SQL-Statements usw. gespeichert, auf die bei Bedarf wieder verwendet werden können.
Gibt es in PostgreSQL einen vergleichbaren Cache? Ich habe das so verstanden, dass hier jede Anweisung neu geparst werden muss. Kann mir das jemand so bestätigen, oder liege ich falsch? Nett wäre eine kurze Beschreibung über diesen Parse Baum.

Vielen Dank und gute Nacht.

Für diesen Zweck stellen die Client Libraries prepared Queries zur Verfügung. Damit lässt du einen bestimmten Query einmal parsen und hälst den Queryplan im Speicher.

Es kommt jetzt darauf an, wie (mit welcher Sprache) du auf die Datenbank zugreifst. Die Methoden sind da unterschiedlich implementiert.

Zugreifen würde ich einfach mit SQL.
Wird der im Speicher gehaltene Query Plan bei einem gleichen Statement dann auch wieder verwendet? Oder wird neu geparst.
Mich würde auch noch interessieren, ob man diesen expliziten Speicherbereich vergrößern, oder andersweitig tunen kann.
Bei Oracle kann man z.B. geparste Statements im Speicher festpinnen, sodass sie nicht mehr verdrängt werden.

Die Frage ist, mit welcher Programmiersprache du auf die Datenbank zugreifst.

Ich sag jetzt einfach mal Java. Ich war mir nicht bewusst, dass das Unterschiede macht. Also in Oracle schreibe ich einfach eine Procedur in PL/SQL:

CREATE OR REPLACE PROCEDURE BASIS_OI (max_count IN INTEGER)
IS
BEGIN
	 FOR counter IN 1.. max_count
	 LOOP
	 EXECUTE IMMEDIATE 'SELECT WERT_1,WERT_2 FROM T_DATA_OI					WHERE WERT_1 < ' || counter;
	 END LOOP;
END BASIS_IO;

Kann man das mit PL/PGSQL nicht auch so machen?
Vielleicht könntest du mir bitte verraten, was die Unterschiede in Bezug die verwendete Programmiersprache sind. Das würde mir sehr helfen.

In jeder Programmiersprache gibt es andere Methoden, mit denen man prepared Queries erzeugt, wie das in Java funktioniert, muss ich leider passen. Die Sprache steht seit grübel 10 Jahren auf meiner Liste, bisher habe ich nichts davon gelernt.

Irgendwo wird es jedoch Methoden geben, einen Query vorzubereiten, das Ergebnis der Vorbereitung zu speichern und dann zusammen mit den Parametern für den Query noch mal an die Datenbank zu senden.

Hallo ads,

du schreibst hier absoluten Unsinn. Die Frage hat mit keiner Programmiersprache zu tun.

Oracle speichert u.a im Shared Pool die zuletzt verwendeten SQL Statements, so das nach dem ersten Aufruf die SQL Statements schneller ausgeführt werden.

Real ist, wenn man z. B. die oben beschrieben Procedure BASIS_OI in die PostgrSQL-Datenbank einspielt, eine Art Compiler läuft. Wenn die Procedure ausgeführt werden soll, wird der Code in dem Speicher geladen. Anschließend muß der Weg bestimmt werden, wie die man zum Ergebnis kommt. Mit Weg ist hier gemeint, was Dir der Befehl Explain als Anfrageplan (query plan) liefert. Dieser Anfrageplan wird durch einen Interpreter erstellt, im Speicher abgelegt und anschließend ausgeführt.

Die obige Frage lautet nun, bleibt nach der Beendigung Procedure BASIS_OI der Code einschließlich des dazu gehörenden Anfrageplans in einem Cache vorübergehen erhalten, oder wird der verwendete Speicher für Code und Anfrageplan direkt nach der Beedigung der Procedure wieder gelöscht?



mfg

fristo

Ach, danke das von dir zu hören.

Ich schrieb, wenn du weiter oben bitte nachlesen möchtest, von prepared Queries. Wie ich so einen Query erzeuge, ist sehr wohl von der Programmiersprache abhängig. Z.B. pg_prepare() in PHP, PQprepare in der C Client Library für PG. Wie das in Java funktioniert, weiss ich leider nicht.

In besagtem Prepared Query wird der Queryplan einmalig erstellt und dann im Speicher vorgehalten.

Wie du weiterhin nachlesen kannst, kam die Frage nach plpgsql Funktionen erst nach meiner Aussage mit Programmiersprachen hinzu. Vorher war immer von einfachem SQL die Rede, was keine stored procedures beinhaltet. Mit plain SQL kannst du eigentlich nur auf die vorbereiteten Queries in deiner Applikation zurückgreifen.

Das nächste Mal lies doch bitte den ganzen Thread, bevor du mir hier Unsinn unterstellst. Danke.


Oracle speichert u.a im Shared Pool die zuletzt verwendeten SQL Statements, so das nach dem ersten Aufruf die SQL Statements schneller ausgeführt werden.

Das macht PG für normale SQL Anfragen nicht.


Die obige Frage lautet nun, bleibt nach der Beendigung Procedure BASIS_OI der Code einschließlich des dazu gehörenden Anfrageplans in einem Cache vorübergehen erhalten, oder wird der verwendete Speicher für Code und Anfrageplan direkt nach der Beedigung der Procedure wieder gelöscht?

plpgsql Funktionen werden beim ersten Laden geparst und der Queryplan wird abgelegt. Darum muss man auch einige Umwege gehen, wenn man dynamische Queries in einer plpgsql Funktion erzeugen möchte.

Hi,
also erstmal einen Dank für Eure angeregte Diskussion.
Leider bin ich jetzt immer noch nicht schlauer(vielleicht liegt das auch an meinem Verständnis). Für mich ist es im Moment eher nebensächlich zu wissen wie prepared Queries erstellt werden.
Wie von fristo festgestellt, interessiert mich tatsächlich erstmal nur, ob einmal geparste Statements gespeichert bleiben(bis sie verdrängt werden oder man dieses herausaltern verhindert) und wiederverwendet werden. Ich kann mir irgendwie nicht vorstellen, dass es für jede Programmiersprache andere, hauptspeicherinterne Verfahrensweisen geben soll.javascript:emoticon(’:?:’)
Question

Vielleicht können wir den Cache in dem der Query Plan gehalten werden soll mal beim Namen nennen. Ich habe leider noch keine Quelle gefunden, wo die Abarbeitungen im Hauptspeicher erklärt sind. Habt ihr eventuell Material oder Links dazu?

Mal abgesehen von ads’s Aussage:
Ich habe gehört das bei PG jedesmal neu geparst werden muss. Da wird dieser Parse Baum angeblich immer neu aufgebaut. Kann diese Aussage bestätigt werden?

Leider muss ich Euch ein bisschen auf die Ketten gehen, aber das ist grad echt wichtig.

Danke für die Hilfe

Also, Anfragen werden jedesmal neu geparst.

Funktionen werden, soweit möglich, einmal geparst und dann im Speicher gehalten.

Da Anfragen jedesmal neu geparst werden, gibt es dafür auch in der Datenbank keinen Speicher, wo die geparsten Pläne hinterlegt werden … nun ja, fast keinen, bis auf halt die erwähnten Prepared Queries, die man aber im Programm aufruft und die immer Programm- bzw. Verbindungsbezogen sind.

Gut, und da wir uns mit der Diskussion schon eine Weile drehen: was genau möchtest du denn erreichen?

Hi,
hat jetzt ein wenig länger gedauert…

Ich schreibe gerade meine Diplomarbeit. Um den Umfang einigermaßen in Grenzen zu halten, habe ich mich bei Oracle auf den Shared Pool beschränkt. In Postgres suche nun, wie schon beschrieben das Pendant. Mit oben geschilderter Prozedur habe ich in Oracle den Shared Pool belastet und dann optimiert(bind-Variablen…).
Hauptthema im Shared Pool ist ja der Library Cache(Wiederverwendung von SQL-Anweisungen…). Ich brauch jetzt eigentlich nur ein Dokument wo din steht wie die Abarbeitung einer Anfrage bei Postgres abläuft und welche Caches dabei berührt werden. Anhand dieses Dokuments könnte ich dann belegen, das in Postgres SQL-Anweisungen immer neu geparst werden.

Re …

Hmm, das ist eine gute Frage und ich bin mir gar nicht sicher, das dies überhaupt irgendwo (ausser im Source) in schriftlicher Form vorliegt.

Ich würde vorschlagen, das du dich mit dieser Frage mal an die -hacker Mailingliste von PostgreSQL wendest, dort dürftest du am ehesten Erfolg haben.