Ist es möglich, die Leistung eines PostgreSQL-Servers innerhalb einer PL / PGSQL-Funktion zu überwachen?
Dies mag exotisch klingen, da ich programmgesteuert wissen möchte, ob es ein "guter Moment" ist, eine PL / PGSQL-Funktion mit hohem Schreibaufwand auf einem Server auszuführen. Mit "guter Moment" meine ich das Nachdenken über einen direkten oder berechneten Indikator für die Laststufe, die Parallelitätsstufe oder eine andere Größe des PostgreSQL-Servers.
Ich bin mir bewusst, dass es eine Reihe fortschrittlicher Anwendungen gibt, die auf Leistungsverfolgung spezialisiert sind, wie z https://www.datadoghq.com. Ich möchte jedoch nur einen einfachen internen KPI, der die Ausführung dieser umfangreichen Schreibvorgänge ändert oder verzögert, bis ein „besserer Moment“ eintritt.
Einige dieser Verfahren löschen Tabellen, andere führen Durchschnitts- / Summenberechnungen über Millionen von Zeilen durch, andere überprüfen entfernte Tabellen usw. Sie warten möglicherweise Minuten oder Stunden auf einen „besseren Moment“, wenn der gleichzeitige Benutzerdruck nachlässt.
Irgendeine Idee?
Antworten
Sie können sehen, wie viele andere Sitzungen aktiv sind, indem Sie Folgendes tun:
select count(*) from pg_stat_activity where state='active';
Sie müssen jedoch ein Superuser sein oder die Rolle pg_monitor haben, sonst ist der Status für Sitzungen anderer Benutzer NULL. Wenn Sie das stört, können Sie mit SECURITY DEFINER eine Funktion schreiben, um den Zugriff auf diese Informationen zu ermöglichen. (Sie sollten dies wahrscheinlich sowieso in eine eigene Funktion integrieren, was bedeutet, dass es keinen Grund gibt, dass es in plpgsql implementiert werden muss, es sei denn, dies ist die einzige Sprache, die Ihnen zur Verfügung steht.)
Sie können auch beliebige Betriebssystemoperationen aufrufen, indem Sie eine entsprechend privilegierte pl-Sprache verwenden. Das schließt von plpgsql durch Missbrauch ein COPY...FROM PROGRAM.