Gibt es ein PostgreSQL-Äquivalent zum SQL Server-Profiler?

81

Ich muss die an einen PostgreSQL-Server gesendeten Abfragen sehen. Normalerweise würde ich den SQL Server-Profiler verwenden, um diese Aktion im SQL Server-Land auszuführen, aber ich muss noch herausfinden, wie dies in PostgreSQL gemacht wird. Es scheint einige kostenpflichtige Tools zu geben, ich hoffe, es gibt eine Open-Source-Variante.

BozoJoe
quelle

Antworten:

59

Mit der Konfigurationseinstellung log_statement können Sie die Liste aller Abfragen an einen Server senden

https://www.postgresql.org/docs/current/static/runtime-config-logging.html#guc-log-statement

Stellen Sie einfach das und den Pfad der Protokolldatei ein und Sie haben die Liste. Sie können es auch so konfigurieren, dass nur lang laufende Abfragen protokolliert werden.

Sie können diese Abfragen dann beantworten und EXPLAIN ausführen, um herauszufinden, was mit ihnen los ist.

https://www.postgresql.org/docs/9.2/static/using-explain.html

Joshua Smith
quelle
1
perfekt, warf einen Schwanz -f dagegen
BozoJoe
3
Nun, es ist schwer, CSV-Protokolldateien als "Äquivalent zum SQL Server-Profiler" zu bezeichnen ...
Feofilakt
31

Um zu Joshuas Antwort hinzuzufügen , um zu sehen, welche Abfragen gerade ausgeführt werden, geben Sie einfach jederzeit die folgende Anweisung ab (z. B. im Abfragefenster von PGAdminIII):

SELECT datname,procpid,current_query FROM pg_stat_activity;

Beispielausgabe:

     datname    | procpid | current_query
 ---------------+---------+---------------
  mydatabaseabc |    2587 | <IDLE>
  anotherdb     |   15726 | SELECT * FROM users WHERE id=123 ;
  mydatabaseabc |   15851 | <IDLE>
 (3 rows)
vladr
quelle
4
Mit meiner Version von PG (9.3) habe ich die folgende Abfrage verwendet: SELECT-Datenname, PID, Benutzername, Anwendungsname, Client-Adresse, Abfrage FROM pg_stat_activity; pg_stat_activity ist eine Ansicht der DB 'postgresql'
mrmuggles
3
SELECT client_addr, state_change, Abfrage FROM pg_stat_activity;
Dmitry Dyachkov
3
Die Spaltenlänge "Abfrage" ist zu kurz, um lange Abfragen anzuzeigen.
Dejan Janjušević
25

Ich habe pgBadger ( http://dalibo.github.io/pgbadger/ ) entdeckt und es ist ein fantastisches Tool, das mir viele Male das Leben gerettet hat. Hier ist ein Beispiel für einen Bericht: http://dalibo.github.io/pgbadger/samplev4.html . Wenn Sie es öffnen und zum Hauptmenü gehen, sehen Sie die langsamsten und zeitaufwändigen Abfragen. Dann können Sie nach Details fragen und schöne Grafiken sehen, die Ihnen die Abfragen nach Stunden zeigen. Wenn Sie die Detailschaltfläche verwenden, können Sie den SQL-Text in einer hübschen Form sehen. So kann ich sehen, dass dieses Tool kostenlos und perfekt ist.

Giovanni Porcari
quelle
2
Ziemlich schönes Werkzeug. Ich habe dieses Tutorial verwendet, um es zu installieren, da das offizielle Dokument ziemlich ausführlich ist: dhis2.org/analysing-postgresql-logs-using-pgbadger
mrmuggles
5
Nur eine Anmerkung, dass das Tool nur für * nix-Systeme ist, was für Windows-Benutzer
Alex Klaus
+1, da das OP nach einem Tool wie SQL Server Profiler gefragt hat, das keine Konfigurationsoptionen zum manuellen Extrahieren der erforderlichen Leistungsinformationen enthält.
EAmez
16

Ich muss die an einen PostgreSQL-Server gesendeten Abfragen sehen

Wenn Sie pgAdmin verwenden (auf meinem Bild ist es pgAdmin 4 v2.1). Sie können Abfragen über die Registerkarte "Dashboard" beobachten: pgadmin4-Abfrage von Anwendung, Dashboard

Andrey Kotov
quelle
2
Dies kann keine langen SQL-Anweisungen anzeigen. Die SQL wird abgeschnitten.
Dejan Janjušević
0

Sie können die Erweiterung pg_stat_statements verwenden .

Wenn Sie die Datenbank im Docker ausführen, fügen Sie einfach diesen Befehl hinzu docker-compose.yml. Andernfalls lesen Sie einfach die Installationsanweisungen für Ihr Setup:

command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c max_connections=200

Und dann in der Datenbank diese Abfrage ausführen:

CREATE EXTENSION pg_stat_statements;

Um nun die Operationen zu sehen, die mehr Zeit in Anspruch genommen haben:

SELECT * FROM pg_stat_statements ORDER BY total_time/calls DESC LIMIT 10;

Oder spielen Sie mit anderen Abfragen in dieser Ansicht, um das zu finden, wonach Sie suchen.

Felipe Pereira
quelle