Performance debuggen

Hallo zusammen,

ich habe eine Prozedur zur Verarbeitung von Daten, welche in mehreren Schritten verschiedene Unterprozeduren aufruft, welche ihrerseits teilweise auch weitere Unterprozeduren aufrufen können. Die Prozeduren bestehen in der Regel aus mehreren SQL-Anweisungen, die Daten in temporären Tabellen prüfen oder verändern.
Um die Performance zu verbessern möchte ich gern wissen, welche der Anweisungen die meiste Zeit brauchen. Manchmal habe ich auch das Problem, dass die Prozedur sehr lange läuft, ich weiß aber nicht, an welcher Stelle es gerade hängt. pg_stat_activity zeigt mir eben nur an, dass die Mutterprozedur läuft aber was deren Kinder so treiben kriege ich nicht raus. Ich habe es mit log_duration true und tail -f auf das Logfile versucht aber das ist sehr unübersichtlich und da schreiben auch viele andere Prozesse rein.
Was ist die beste/einfachste Möglichkeit, das zu tun, also einen einzelnen Prozess/eine konkrete Session zu tracen, wo sie sich gerade befindet und wieviel Zeit was gebraucht hat.

Vielen Dank Pittiplatsch

Du kannst/solltest:

  • auf temp. Tabellen, wenn möglich, verzichten
  • mit RAISE NOTICE Meldungen um Dich werfen, z.B. wo Du grad ist oder wie spät es ist.
  • Dich mit Explain beschäftigen
  • Du kannst application_name setzen und das im Log auswerten (Log_line_prefix passend setzen)
  • Du kannst innerhalb einer Session auch das Logging anpassen (log_min_duration etc)
  • das Contrib-Modul auto_explain nutzen und Dich mit auto_explain.log_nested_statements anfreunden

Dank für die schnelle Antwort.
das mit raise notice habe ich bisher gemacht um mir zu behelfen. Ist aber eben sehr aufwändig. (Wir reden hier von einem Prozess mit mittlerweile etwa 100 Prozeduren) Und ich muss mich dann eben immer erst an die entsprechende Stelle hangeln, ich will ja nicht permanent damit um mich werfen.
Das mit dem application_name scheint mir hilfreich, dann könnte ich danach greppen. Werde ich versuchen.
Kannst du bitte noch was zu dem contrib_modul sagen, wo und wie, das sagt mir bisher garnichts. Ein Einstieg wäre nett.

http://www.postgresql.org/docs/9.4/interactive/auto-explain.html