{"id":32353,"date":"2019-10-31T21:46:32","date_gmt":"2019-10-31T18:46:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting\/"},"modified":"2019-10-31T21:46:32","modified_gmt":"2019-10-31T18:46:32","slug":"monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","title":{"rendered":"\u00dcberwachung der Leistungsf\u00e4higkeit von PostgreSQL-Anfragen. Teil 1 \u2014 Berichterstattung","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Der Ingenieur \u2013 abgeleitet aus dem Lateinischen \u2013 ist inspiriert.<br \/>\nEin Ingenieur kann alles. (c) R. Diesel.<br \/>\n<i>Episoden.<\/i><br \/>\n<img decoding=\"async\" alt=\"\u00dcberwachung der Leistungsf\u00e4higkeit von PostgreSQL-Anfragen. Teil 1 \u2014 Berichterstattung\" src=\"\/wp-content\/uploads\/2019\/04\/9a2640267ea05006b94e03642b864ddc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Oder die Geschichte dar\u00fcber, warum ein Datenbankadministrator seine Programmiervergangenheit nicht vergessen sollte. <\/i><\/p>\n<h2>Vorwort<\/h2>\n<p>\nAlle Namen sind ge\u00e4ndert. Alle \u00c4hnlichkeiten sind rein zuf\u00e4llig. Der Inhalt stellt ausschlie\u00dflich die pers\u00f6nliche Meinung des Autors dar.<\/p>\n<blockquote><p><b>Haftungsausschluss:<\/b> <i>In der geplanten Artikelreihe wird es keine detaillierte und genaue Beschreibung der verwendeten Tabellen und Skripte geben. Das Material kann nicht sofort 'AS IS' verwendet werden. <br \/>\nErstens aufgrund des gro\u00dfen Umfangs des Materials, <br \/>\nzweitens aufgrund der Anpassung an die Produktionsdatenbank des tats\u00e4chlichen Kunden. <br \/>\nDaher werden in den Artikeln nur Ideen und Beschreibungen in allgemeinster Form dargestellt. <br \/>\nM\u00f6glicherweise wird das System in der Zukunft den Status erreichen, auf GitHub ver\u00f6ffentlicht zu werden, vielleicht auch nicht. Die Zeit wird es zeigen.<\/i><\/p><\/blockquote>\n<p>\nDer Beginn der Geschichte \u2013 \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/icl_services\/blog\/446314\/\">Erinnerst du dich, wie alles begann?<\/a><\/noindex>\u00bb.<br \/>\nWas daraus geworden ist, sehr allgemein \u2013 \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Synthese als eine Methode zur Leistungssteigerung von PostgreSQL<\/a><\/noindex>\u00bb<\/p>\n<h2>Warum ist das alles f\u00fcr mich wichtig?<\/h2>\n<p>\nNun, erstens, um selbst nicht zu vergessen und in der Rente an die glorreichen Tage zur\u00fcckzudenken. <br \/>\nUnd zweitens, um das Geschriebene zu systematisieren. Denn ich selbst beginne manchmal, mich zu verwirren und einzelne Teile zu vergessen. <\/p>\n<p>Und das Wichtigste: Vielleicht kann es jemandem n\u00fctzlich sein und helfen, das Rad nicht neu zu erfinden und keine Fehler zu sammeln. Mit anderen Worten, verbessern Sie Ihr Karma (nicht das von Habr). Denn das Wertvollste in dieser Welt sind Ideen. Es geht darum, die richtige Idee zu finden. Die Umsetzung dieser Idee in die Realit\u00e4t ist dann schon eine rein technische Angelegenheit.<\/p>\n<p>Lassen Sie uns also langsam beginnen...<\/p>\n<h2>Aufgabenstellung.<\/h2>\n<p><\/p>\n<h3>Folgendes habe ich: <\/h3>\n<p>\nDatenbank PostgreSQL (10.5), gemischte Arbeitslast (OLTP+DSS), mittel bis gering belastet, gehostet in der AWS-Cloud. <br \/>\nMonitoring der Datenbank ist nicht vorhanden, das Monitoring der Infrastruktur erfolgt durch die standardm\u00e4\u00dfigen AWS-Tools in minimaler Konfiguration.<\/p>\n<h3>Anforderungen:<\/h3>\n<p>\nLeistung und Zustand der Datenbank \u00fcberwachen, Informationen sammeln und zur Optimierung schwerer Datenbankabfragen bereitstellen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Kurze Einleitung oder Analyse m\u00f6glicher L\u00f6sungsans\u00e4tze<\/h2>\n<p>\nZun\u00e4chst versuchen wir, die L\u00f6sungsans\u00e4tze aus der Sicht eines Vergleichs der Vor- und Nachteile f\u00fcr den Ingenieur zu analysieren, w\u00e4hrend sich das Management um Nutzen und Verluste k\u00fcmmert, was deren Aufgabe gem\u00e4\u00df der Stellenbeschreibung ist.<\/p>\n<h3>Option 1 - \u201eWorking on demand\u201c<\/h3>\n<p>\nWir lassen alles wie es ist. Wenn der Kunde mit der Funktionsweise oder der Leistung der Datenbank oder Anwendung unzufrieden ist, wird er die DBA-Ingenieure per E-Mail benachrichtigen oder ein Ticket im Ticketsystem erstellen. <br \/>\nDer Ingenieur, der die Benachrichtigung erh\u00e4lt, wird das Problem analysieren, eine L\u00f6sung vorschlagen oder das Problem auf die lange Bank schieben, in der Hoffnung, dass sich alles von selbst regelt, und ohnehin bald wieder vergessen wird.<br \/>\n<b class=\"spoiler_title\">S\u00fc\u00dfgeb\u00e4ck und Leckereien, blaue Flecken und Beulen<\/b><b>S\u00fc\u00dfgeb\u00e4ck und Leckereien:<\/b><br \/>\n1. Es ist nichts \u00fcberfl\u00fcssiges zu tun.<br \/>\n2. Es gibt immer die M\u00f6glichkeit, sich herauszureden und faul zu sein. <br \/>\n3. Eine Menge Zeit, die man nach eigenem Ermessen verbringen kann.<br \/>\n<b>Blaue Flecken und Beulen:<\/b><br \/>\n1. Fr\u00fch oder sp\u00e4t wird der Kunde \u00fcber den Sinn des Lebens und die universelle Gerechtigkeit in dieser Welt nachdenken und sich erneut die Frage stellen \u2013 wof\u00fcr zahle ich ihnen mein Geld? Die Konsequenz ist immer die gleiche \u2013 die Frage ist nur, wann der Kunde sich langweilt und auf Wiedersehen winkt. Dann wird die Futterquelle leer sein. Das ist traurig.<br \/>\n2. Die Entwicklung des Ingenieurs \u2013 null.<br \/>\n3. Schwierigkeiten bei der Planung von Arbeit und Belastung. <\/p>\n<h3>Option 2 - \u201aWir tanzen mit Trommeln, verkaufen und schuhen\u2018.<\/h3>\n<p>\n<b>Punkt 1<\/b>-Warum brauchen wir ein Monitoring-System? Wir erhalten alles \u00fcber Anfragen. Wir starten eine Vielzahl von Anfragen an das Datenw\u00f6rterbuch und dynamische Darstellungen, aktivieren verschiedene Z\u00e4hler und fassen alles in Tabellen zusammen, analysieren in regelm\u00e4\u00dfigen Abst\u00e4nden diese Listen und Tabellen. Am Ende haben wir h\u00fcbsche oder weniger h\u00fcbsche Grafiken, Tabellen, Berichte. Das Wichtigste ist, dass wir von allem mehr haben.<br \/>\n<b>Punkt2<\/b>-Wir generieren Aktivit\u00e4t \u2013 analysieren das Ganze.<br \/>\n<b>Punkt3<\/b>-Wir erstellen ein Dokument, das wir einfach \u201eWie wir die Datenbank einrichten\u201c nennen.<br \/>\n<b>Punkt4<\/b>-Der Kunde betrachtet all diese gro\u00dfartigen Grafiken und Zahlen und glaubt naiv: Jetzt wird alles funktionieren, bald. Und er gibt bereitwillig seine finanziellen Mittel aus. Das Management ist ebenfalls \u00fcberzeugt \u2013 unsere Ingenieure sind echte Experten. Die Auslastung ist auf dem Maximum. <br \/>\n<b>Punkt5<\/b>-Punkt 1 regelm\u00e4\u00dfig wiederholen.<br \/>\n<b class=\"spoiler_title\">S\u00fc\u00dfgeb\u00e4ck und Leckereien, blaue Flecken und Beulen<\/b><b>S\u00fc\u00dfgeb\u00e4ck und Leckereien: <\/b><br \/>\n1. Das Leben der Manager und Ingenieure ist einfach, vorhersehbar und voller Aktivit\u00e4t. Alles summt, alle sind besch\u00e4ftigt. <br \/>\n2. Das Leben eines Kunden ist ebenfalls nicht schlecht \u2013 er ist sich immer sicher, dass man nur ein wenig Geduld haben muss, und alles wird gut. Wenn es nicht funktioniert, naja, das ist die ungerechte Welt, in der n\u00e4chsten Leben wird es besser.<br \/>\n<b>Blaue Flecken und Beulen:<\/b><br \/>\n1. Fr\u00fcher oder sp\u00e4ter wird es einen agilen Anbieter f\u00fcr \u00e4hnliche Dienstleistungen geben, der das Gleiche etwas g\u00fcnstiger macht. Wenn das Ergebnis dasselbe ist, warum also mehr bezahlen? Das f\u00fchrt wieder zum Verschwinden der Einnahmequelle.<br \/>\n2. Das ist langweilig. So langweilig wie jede bedeutungslose Aktivit\u00e4t.<br \/>\n3. Wie im vorherigen Fall \u2013 es gibt keine Entwicklung. Aber f\u00fcr Ingenieure ist es ein Nachteil, dass man im Gegensatz zur ersten Variante hier st\u00e4ndig die Datenbanken aktualisieren muss. Und das kostet Zeit. Zeit, die man sinnvoll f\u00fcr sich selbst nutzen k\u00f6nnte. Denn wenn man sich nicht um sich selbst k\u00fcmmert, k\u00fcmmert sich auch niemand um einen.<\/p>\n<h3>Option 3 \u2013 Man muss das Rad nicht neu erfinden, man sollte es kaufen und fahren.<\/h3>\n<p>\nIngenieure anderer Firmen essen nicht umsonst Pizza und trinken dazu Bier (ach, die guten alten Zeiten in St. Petersburg der 90er). Lass uns die \u00dcberwachungssysteme nutzen, die gemacht, getestet und funktionierend sind, und die grunds\u00e4tzlich Nutzen bringen (zumindest f\u00fcr ihre Sch\u00f6pfer).<br \/>\n<b class=\"spoiler_title\">S\u00fc\u00dfgeb\u00e4ck und Leckereien, blaue Flecken und Beulen<\/b><b>S\u00fc\u00dfgeb\u00e4ck und Leckereien:<\/b><br \/>\n1. Verschwendet keine Zeit mit dem Erfinden von Dingen, die bereits erfunden wurden. Nutzt, was vorhanden ist.<br \/>\n2. \u00dcberwachungssysteme werden nicht von Dummk\u00f6pfen entworfen, und sie sind auf jeden Fall n\u00fctzlich.<br \/>\n3. Funktionierende \u00dcberwachungssysteme liefern in der Regel n\u00fctzliche gefilterte Informationen. <br \/>\n<b>Blaue Flecken und Beulen:<\/b><br \/>\n1. In diesem Fall ist der Ingenieur kein Ingenieur, sondern lediglich ein Benutzer eines fremden Produkts. Oder ein Nutzer.<br \/>\n2. Der Kunde muss davon \u00fcberzeugt werden, etwas zu kaufen, mit dem er sich grunds\u00e4tzlich nicht auskennt und auch nicht sollte; au\u00dferdem ist das Jahresbudget genehmigt und wird sich nicht \u00e4ndern. Dann muss ein separates Ressource bereitgestellt und f\u00fcr das spezifische System konfiguriert werden. Zuerst muss man bezahlen, bezahlen und nochmals bezahlen. Und der Kunde ist knauserig. Das ist die Norm in dieser Welt.<\/p>\n<h2>Was sollen wir tun, Tschernyschewski? Deine Frage ist sehr passend. (c)<\/h2>\n<p>\nIn diesem konkreten Fall und der gegebenen Situation k\u00f6nnen wir es ein wenig anders machen \u2014 <b>lass uns unser eigenes \u00dcberwachungssystem erstellen. <\/b><br \/>\n<img decoding=\"async\" alt=\"\u00dcberwachung der Leistungsf\u00e4higkeit von PostgreSQL-Anfragen. Teil 1 \u2014 Berichterstattung\" src=\"\/wp-content\/uploads\/2019\/04\/b59a3ad9e16b68c0fbc962a61d571c52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDas ist zwar nicht im vollen Sinne des Wortes ein System, das w\u00e4re zu hochtrabend und \u00fcberheblich, aber es kann helfen, die Aufgabe zu erleichtern und mehr Informationen zum L\u00f6sen von Leistungsproblemen zu sammeln. Damit man nicht in die Situation kommt: \u201eGeh dorthin, wo ich nicht wei\u00df, wo, finde das, was ich nicht kenne\u201c.<\/p>\n<h4>Welche Vor- und Nachteile hat diese Option?<\/h4>\n<p><b>Vorteile:<\/b><br \/>\n1. Es ist interessant. Zumindest interessanter als st\u00e4ndiges \u201eDatafile verkleinern, Tablespace \u00e4ndern usw.\u201c. <br \/>\n2. Es sind neue F\u00e4higkeiten und neue Entwicklungen. Die langfristig irgendwann die verdienten Belohnungen und Erfolge bringen werden.<br \/>\n<b>Nachteile:<\/b><br \/>\n1. Man wird arbeiten m\u00fcssen. Viel arbeiten. <br \/>\n2. Man wird regelm\u00e4\u00dfig den Sinn und die Perspektiven der gesamten Aktivit\u00e4ten erkl\u00e4ren m\u00fcssen.<br \/>\n3. Man muss irgendwo Abstriche machen, denn die einzige Ressource, die einem Ingenieur zur Verf\u00fcgung steht, ist die Zeit, und die ist im Universum begrenzt. <br \/>\n<b>4. Das Schlimmste und Unangenehmste<\/b> ist, dass am Ende etwas herauskommen kann, das weder Maus noch Frosch, sondern ein unbekanntes Wesen ist.<\/p>\n<p><b>Wer nicht riskiert, trinkt keinen Champagner.<\/b><br \/>\nUnd jetzt beginnt das Interessanteste.<\/p>\n<h2>Die allgemeine Idee \u2013 schematisch<\/h2>\n<p>\n<img decoding=\"async\" alt=\"\u00dcberwachung der Leistungsf\u00e4higkeit von PostgreSQL-Anfragen. Teil 1 \u2014 Berichterstattung\" src=\"\/wp-content\/uploads\/2019\/04\/d1ae2ddc1d4c43353fe93eebdaa8b81a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(<i>Die Abbildung stammt aus einem Artikel.<\/i> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444988\/\">Synthese als eine Methode zur Leistungssteigerung von PostgreSQL<\/a><\/noindex>\u00bb)<\/p>\n<p>Erkl\u00e4rung:<\/p>\n<ul>\n<li> In der Ziel-Datenbank wird die Standarderweiterung PostgreSQL \u2013 \u201epg_stat_statements\u201c \u2013 installiert. <\/li>\n<li>In der \u00dcberwachungsdatenbank erstellen wir einen Satz von Servicetabellen zur Speicherung der Historie von pg_stat_statements in der Anfangsphase sowie zur Konfiguration von Metriken und Monitoring f\u00fcr die Zukunft.<\/li>\n<li> Auf dem \u00dcberwachungs-Host erstellen wir eine Reihe von Bash-Skripten, unter anderem zur Generierung von Vorf\u00e4llen im Ticketsystem. <\/li>\n<\/ul>\n<h2>Servicetabellen<\/h2>\n<p>\nZun\u00e4chst eine schematisch vereinfachte ERD, was am Ende herausgekommen ist:<br \/>\n<img decoding=\"async\" alt=\"\u00dcberwachung der Leistungsf\u00e4higkeit von PostgreSQL-Anfragen. Teil 1 \u2014 Berichterstattung\" src=\"\/wp-content\/uploads\/2019\/04\/03d29f4d6932d470d9d88651cbf0c715.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b class=\"spoiler_title\">Kurzbeschreibung der Tabellen<\/b><b>endpoint <\/b> \u2014 Host, Verbindungsstelle zur Instanz<br \/>\n<b>database <\/b> \u2014 Datenbankparameter<br \/>\n<b>pg_stat_history <\/b> \u2014 Historische Tabelle zur Speicherung von Schnappsch\u00fcssen der Darstellung von pg_stat_statements der Ziel-Datenbank<br \/>\n<b>metric_glossary <\/b> \u2014 Glossar der Leistungsmetriken<br \/>\n<b>metric_config <\/b> \u2014 Konfiguration einzelner Metriken<br \/>\n<b>metric <\/b> \u2014 Konkrete Metrik f\u00fcr die \u00fcberwachte Anfrage<br \/>\n<b>metric_alert_history <\/b> \u2014 Historie der Leistungswarnungen<br \/>\n<b>log_query <\/b> \u2014 Servicetabelle zur Speicherung der analysierten Eintr\u00e4ge aus der PostgreSQL-Logdatei, die von AWS geladen wird.<br \/>\n<b>baseline <\/b> \u2014 Parameter f\u00fcr den Zeitraum, der als Basis verwendet wird <br \/>\n<b>checkpoint <\/b> \u2014 Konfiguration der Metriken zur \u00dcberpr\u00fcfung des Zustands der Datenbank<br \/>\n<b>checkpoint_alert_history <\/b> \u2014 Historie der Warnungen zu den Metriken der Zustand\u00fcberpr\u00fcfung der Datenbank<br \/>\n<b>pg_stat_db_queries <\/b> \u2014 Servicetabelle aktiver Anfragen <br \/>\n<b>activity_log <\/b> \u2014 Systemtabelle f\u00fcr Aktivit\u00e4tsprotokolle <br \/>\n<b>trap_oid <\/b> \u2014 Systemtabelle f\u00fcr Trap-Konfiguration<\/p>\n<p><\/p>\n<h2>Schritt 1 \u2013 Sammeln von Leistungsstatistiken und Erstellen von Berichten<\/h2>\n<p>\nDie Tabelle dient zur Speicherung von Statistiken <b>pg_stat_history<\/b><br \/>\n<b class=\"spoiler_title\">Struktur der Tabelle pg_stat_history<\/b><\/p>\n<pre>\n                                          Tabelle \"public.pg_stat_history\"<br \/>\n       Spalte         |            Typ                |                          Modifikatoren<br \/>\n---------------------+-------------------------------+-------------------------------------------<br \/>\n id                  | integer                       | nicht null Standard nextval('pg_stat_history_id_seq'::regclass)<br \/>\n snapshot_timestamp   | timestamp ohne Zeitzone      |<br \/>\n database_id         | integer                       |<br \/>\n dbid                | oid                           |<br \/>\n userid              | oid                           |<br \/>\n queryid             | bigint                        |<br \/>\n query               | text                          |<br \/>\n calls               | bigint                        |<br \/>\n total_time          | double precision              |<br \/>\n min_time            | double precision              |<br \/>\n max_time            | double precision              |<br \/>\n mean_time           | double precision              |<br \/>\n stddev_time         | double precision              |<br \/>\n rows                | bigint                        |<br \/>\n shared_blks_hit     | bigint                        |<br \/>\n shared_blks_read    | bigint                        |<br \/>\n shared_blks_dirtied | bigint                        |<br \/>\n shared_blks_written | bigint                        |<br \/>\n local_blks_hit      | bigint                        |<br \/>\n local_blks_read     | bigint                        |<br \/>\n local_blks_dirtied  | bigint                        |<br \/>\n local_blks_written  | bigint                        |<br \/>\n temp_blks_read      | bigint                        |<br \/>\n temp_blks_written   | bigint                        |<br \/>\n blk_read_time       | double precision              |<br \/>\n blk_write_time      | double precision              |<br \/>\n baseline_id         | integer                       |<br \/>\nIndizes:<br \/>\n    \"pg_stat_history_pkey\" PRIM\u00c4RSCHL\u00dcSSEL, btree (id)<br \/>\n    \"database_idx\" btree (database_id)<br \/>\n    \"queryid_idx\" btree (queryid)<br \/>\n    \"snapshot_timestamp_idx\" btree (snapshot_timestamp)<br \/>\nFremdschl\u00fcsselbeschr\u00e4nkungen:<br \/>\n    \"database_id_fk\" FREMDSCHL\u00dcSSEL (database_id) VERWEIST AUF database(id) BEI L\u00d6SCHEN CASCADE<\/pre>\n<p>\nDie Tabelle stellt lediglich kumulierte Daten dar. <b>pg_stat_statements <\/b> in der Zieldatenbank.<\/p>\n<h3>Die Nutzung dieser Tabelle ist sehr einfach.<\/h3>\n<p>\n<b>pg_stat_history<\/b> Sie zeigt die akkumulierte Statistik der ausgef\u00fchrten Abfragen pro Stunde an. Zu Beginn jeder Stunde wird, nachdem die Tabelle gef\u00fcllt wurde, die Statistik <b>pg_stat_statements<\/b> mit Hilfe von <b>pg_stat_statements_reset()<\/b>.<br \/>\nHinweis: <i>gesammelt, wobei die Abfragen mit einer Ausf\u00fchrungsdauer von \u00fcber 1 Sekunde ber\u00fccksichtigt werden.<\/i><br \/>\n<b class=\"spoiler_title\">Die Tabelle pg_stat_history wird gef\u00fcllt.<\/b><\/p>\n<pre><code class=\"plaintext\">--pg_stat_history.sql\nCREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$\nDECLARE\n  endpoint_rec record ;\n  database_rec record ;\n  pg_stat_snapshot record ;\n  current_snapshot_timestamp timestamp without time zone;\nBEGIN\n  current_snapshot_timestamp = date_trunc('minute',now());  \n  \n  FOR endpoint_rec IN SELECT * FROM endpoint \n  LOOP\n    FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id \n\t  LOOP\n\t    \n\t\tRAISE NOTICE 'NEUES SNAPSHOT WIRD ERSTELLT';\n\t\t\n\t\t-- Verbindung zur Ziel-Datenbank herstellen\t  \n\t    EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';\n \n        RAISE NOTICE 'Host % und Datenbankname % ',endpoint_rec.host,database_rec.name;\n\t\tRAISE NOTICE 'Erstelle Snapshot von pg_stat_statements f\u00fcr Datenbank %',database_rec.name;\n\t\t\n\t\tSELECT \n\t      *\n\t\tINTO \n\t\t  pg_stat_snapshot\n\t    FROM dblink('LINK1',\n\t      'SELECT \n\t       dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) , \n           SUM(local_blks_hit) , SUM(local_blks_read) , SUM(local_blks_dirtied) , SUM(local_blks_written) , SUM(temp_blks_read) , SUM(temp_blks_written) , SUM(blk_read_time) , SUM(blk_write_time)\n\t       FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() ) \n\t\t   GROUP BY dbid\n  \t      '\n\t               )\n\t      AS t\n\t       ( dbid oid , calls bigint , \n  \t         total_time double precision , \n\t         rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written\t bigint ,\n             local_blks_hit\t bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,\n             temp_blks_read\t bigint ,temp_blks_written bigint ,\n             blk_read_time double precision , blk_write_time double precision\t  \n\t       );\n\t\t \n\t\tINSERT INTO pg_stat_history\n          ( \n\t\t    snapshot_timestamp  ,database_id  ,\n\t\t\tdbid , calls  ,total_time ,\n            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , \t \t\n            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, \t\n            blk_read_time, blk_write_time \n\t\t  )\t\t  \n\t    VALUES\n\t      (\n\t       current_snapshot_timestamp ,\n\t\t   database_rec.id ,\n\t       pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,\n\t       pg_stat_snapshot.total_time,\n\t       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , \n           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , \n\t       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time \t   \n\t      );\t\t   \n\t\t  \n        RAISE NOTICE 'Erstelle Snapshot von pg_stat_statements f\u00fcr Abfragen mit min_time gr\u00f6\u00dfer als 1000ms';\n\t\n        FOR pg_stat_snapshot IN\n          -- Alle Abfragen mit max_time gr\u00f6\u00dfer als 1000 ms\n\t      SELECT \n\t        *\n\t      FROM dblink('LINK1',\n\t        'SELECT \n\t         dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,\n\t\t\t shared_blks_read ,shared_blks_dirtied ,shared_blks_written , \n             local_blks_hit , local_blks_read , local_blks_dirtied , \n\t\t\t local_blks_written , temp_blks_read , temp_blks_written , blk_read_time , \n\t\t\t blk_write_time\n\t         FROM pg_stat_statements \n\t\t\t WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time &gt;= 1000 ) \n  \t        '\n\n\t                  )\n\t        AS t\n\t         ( dbid oid , userid oid , queryid bigint ,query text , calls bigint , \n  \t           total_time double precision ,min_time double precision\t ,max_time double precision\t , mean_time double precision\t ,  stddev_time double precision\t , \n\t           rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written\t bigint ,\n               local_blks_hit\t bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,\n               temp_blks_read\t bigint ,temp_blks_written bigint ,\n               blk_read_time double precision , blk_write_time double precision\t  \n\t         )\n\t    LOOP\n\t\t  INSERT INTO pg_stat_history\n          ( \n\t\t    snapshot_timestamp  ,database_id  ,\n\t\t\tdbid ,userid  , queryid  , query  , calls  ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,\n            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , \t \t\n            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, \t\n            blk_read_time, blk_write_time \n\t\t  )\t\t  \n\t      VALUES\n\t      (\n\t       current_snapshot_timestamp ,\n\t\t   database_rec.id ,\n\t       pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,\n\t       pg_stat_snapshot.total_time,pg_stat_snapshot.min_time ,pg_stat_snapshot.max_time,pg_stat_snapshot.mean_time, pg_stat_snapshot.stddev_time ,\n\t       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , \n           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , \n\t       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time \t   \n\t      );\n\t\t  \n        END LOOP;\n\n        PERFORM dblink_disconnect('LINK1');  \n\t\t\t\t\n\t  END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id \n    \n  END LOOP;\n\nRETURN TRUE;  \nEND\n$$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>Nach einer gewissen Zeit in der Tabelle <b>pg_stat_history<\/b> werden wir eine Sammlung von Snapshot-Inhalten der <b>pg_stat_statements <\/b>Ziel-Datenbank haben. <\/p>\n<h2>Eigentlich das Reporting<\/h2>\n<p>\nMit einfachen Abfragen lassen sich durchaus n\u00fctzliche und interessante Berichte erstellen.<\/p>\n<h2>Aggregierte Daten f\u00fcr den angegebenen Zeitraum<\/h2>\n<p><b class=\"spoiler_title\">Abfrage<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  database_id , \n  SUM(calls) AS calls ,SUM(total_time)  AS total_time ,\n  SUM(rows) AS rows , SUM(shared_blks_hit)  AS shared_blks_hit,\n  SUM(shared_blks_read) AS shared_blks_read , \n  SUM(shared_blks_dirtied) AS shared_blks_dirtied,\n  SUM(shared_blks_written) AS shared_blks_written , \n  SUM(local_blks_hit) AS local_blks_hit , \n  SUM(local_blks_read) AS local_blks_read , \n  SUM(local_blks_dirtied) AS local_blks_dirtied , \n  SUM(local_blks_written)  AS local_blks_written,\n  SUM(temp_blks_read) AS temp_blks_read, \n  SUM(temp_blks_written) temp_blks_written , \n  SUM(blk_read_time) AS blk_read_time , \n  SUM(blk_write_time) AS blk_write_time\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NULL AND\n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nGROUP BY database_id ;<\/code><\/pre>\n<p><\/p>\n<h4>DB-Zeit<\/h4>\n<blockquote><p>to_char(interval '1 millisecond' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')<\/p><\/blockquote>\n<p><\/p>\n<h4>I\/O Zeit<\/h4>\n<blockquote><p>to_char(interval '1 millisecond' * (pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time), 'HH24:MI:SS.MS')<\/p><\/blockquote>\n<h3>TOP10 SQL nach total_time<\/h3>\n<p><b class=\"spoiler_title\">Abfrage<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  queryid , \n  SUM(calls) AS calls ,\n  SUM(total_time)  AS total_time  \t\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT \nGROUP BY queryid \nORDER BY 3 DESC \nLIMIT 10<\/code><\/pre>\n<pre>-------------------------------------------------------------------------------------\n| TOP10 SQL NACH GESAMTER AUSF\u00dcHRUNGSDAUER\n|   #|    queryid|      Aufrufe|    Aufrufe %|                Gesamtzeit (ms) |  dbtime %\n+----+-----------+-----------+-----------+--------------------------------+----------\n|   1|  821760255|          2|     .00001|00:03:23.141(    203141.681 ms.)|      5.42\n|   2| 4152624390|          2|     .00001|00:03:13.929(    193929.215 ms.)|      5.17\n|   3| 1484454471|          4|     .00001|00:02:09.129(    129129.057 ms.)|      3.44\n|   4|  655729273|          1|     .00000|00:02:01.869(    121869.981 ms.)|      3.25\n|   5| 2460318461|          1|     .00000|00:01:33.113(     93113.835 ms.)|      2.48\n|   6| 2194493487|          4|     .00001|00:00:17.377(     17377.868 ms.)|       .46\n|   7| 1053044345|          1|     .00000|00:00:06.156(      6156.352 ms.)|       .16\n|   8| 3644780286|          1|     .00000|00:00:01.063(      1063.830 ms.)|       .03\n<\/pre>\n<h4>TOP10 SQL nach gesamter I\/O-Zeit<\/h4>\n<p><b class=\"spoiler_title\">Abfrage<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  queryid , \n  SUM(auftritte) AS aufrufe ,\n  SUM(blk_read_time + blk_write_time)  AS io_zeit\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nGROUP BY  queryid \nORDER BY 3 DESC \nLIMIT 10<\/code><\/pre>\n<pre>----------------------------------------------------------------------------------------\n| TOP10 SQL NACH GESAMTER I\/O-ZEIT\n|   #|    queryid|      Aufrufe|    Aufrufe %|                   I\/O-Zeit (ms)|DB I\/O-Zeit %\n+----+-----------+-----------+-----------+--------------------------------+-------------\n|   1| 4152624390|          2|     .00001|00:08:31.616(    511616.592 ms.)|        31.06\n|   2|  821760255|          2|     .00001|00:08:27.099(    507099.036 ms.)|        30.78\n|   3|  655729273|          1|     .00000|00:05:02.209(    302209.137 ms.)|        18.35\n|   4| 2460318461|          1|     .00000|00:04:05.981(    245981.117 ms.)|        14.93\n|   5| 1484454471|          4|     .00001|00:00:39.144(     39144.221 ms.)|         2.38\n|   6| 2194493487|          4|     .00001|00:00:18.182(     18182.816 ms.)|         1.10\n|   7| 1053044345|          1|     .00000|00:00:16.611(     16611.722 ms.)|         1.01\n|   8| 3644780286|          1|     .00000|00:00:00.436(       436.205 ms.)|          .03\n<\/pre>\n<h4>TOP10 SQL nach maximaler Ausf\u00fchrungszeit<\/h4>\n<p><b class=\"spoiler_title\">Abfrage<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  id AS snapshotid , \n  queryid , \n  snapshot_timestamp ,  \n  max_time \nFROM \n  pg_stat_history \nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nORDER BY 4 DESC \nLIMIT 10<\/code><\/pre>\n<p><\/p>\n<pre>-----------------------------------------------------------------------------------------\n| TOP10 SQL NACH MAX. AUSF\u00dcHRUNGSZEIT\n|   #|          snapshot| snapshotID|    queryid|                           max_time (ms)\n+----+------------------+-----------+-----------+----------------------------------------\n|   1|  05.04.2019 01:03|       4169|  655729273|        00:02:01.869(    121869.981 ms.)\n|   2|  04.04.2019 17:00|       4153|  821760255|        00:01:41.570(    101570.841 ms.)\n|   3|  04.04.2019 16:00|       4146|  821760255|        00:01:41.570(    101570.841 ms.)\n|   4|  04.04.2019 16:00|       4144| 4152624390|        00:01:36.964(     96964.607 ms.)\n|   5|  04.04.2019 17:00|       4151| 4152624390|        00:01:36.964(     96964.607 ms.)\n|   6|  05.04.2019 10:00|       4188| 1484454471|        00:01:33.452(     93452.150 ms.)\n|   7|  04.04.2019 17:00|       4150| 2460318461|        00:01:33.113(     93113.835 ms.)\n|   8|  04.04.2019 15:00|       4140| 1484454471|        00:00:11.892(     11892.302 ms.)\n|   9|  04.04.2019 16:00|       4145| 1484454471|        00:00:11.892(     11892.302 ms.)\n|  10|  04.04.2019 17:00|       4152| 1484454471|        00:00:11.892(     11892.302 ms.)\n<\/pre>\n<h4>TOP10 SQL nach GETEILTEN Puffer Lese-\/Schreibvorg\u00e4ngen<\/h4>\n<p><b class=\"spoiler_title\">Abfrage<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  id AS snapshotid , \n  queryid ,\n  snapshot_timestamp , \n  shared_blks_read , \n  shared_blks_written \nFROM \n  pg_stat_history\nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND\n  ( shared_blks_read &gt; 0 OR shared_blks_written &gt; 0 )\nORDER BY 4 DESC  , 5 DESC \nLIMIT 10<\/code><\/pre>\n<pre>--------------------------------------------------------------------------------------------\n| TOP10 SQL DURCH GETEILTEN BUFFER LESEN\/SCHREIBEN\n|   #|          Snapshot| SnapshotID|    AbfrageID|   Gelesene gemeinsame Bl\u00f6cke|  Geschriebene gemeinsame Bl\u00f6cke\n+----+------------------+-----------+-----------+----------------------------+----------------------------\n|   1|  04.04.2019 17:00|       4153|  821760255|               797308|                    0\n|   2|  04.04.2019 16:00|       4146|  821760255|               797308|                    0\n|   3|  05.04.2019 01:03|       4169|  655729273|               797158|                    0\n|   4|  04.04.2019 16:00|       4144| 4152624390|               756514|                    0\n|   5|  04.04.2019 17:00|       4151| 4152624390|               756514|                    0\n|   6|  04.04.2019 17:00|       4150| 2460318461|               734117|                    0\n|   7|  04.04.2019 17:00|       4155| 3644780286|                52973|                    0\n|   8|  05.04.2019 01:03|       4168| 1053044345|                52818|                    0\n|   9|  04.04.2019 15:00|       4141| 2194493487|                52813|                    0\n|  10|  04.04.2019 16:00|       4147| 2194493487|                52813|                    0\n--------------------------------------------------------------------------------------------\n<\/pre>\n<h4>Histogramm der Anfragenverteilung nach maximaler Ausf\u00fchrungszeit<\/h4>\n<p><b class=\"spoiler_title\">Abfragen<\/b><\/p>\n<pre><code class=\"plaintext\">W\u00c4HLEN  \n  MIN(max_time) AS hist_min  , \n  MAX(max_time) AS hist_max , \n  (( MAX(max_time) - MIN(min_time) ) \/ hist_columns ) als hist_width\nVON \n  pg_stat_history \nWO \n  queryid IST NICHT NULL UND\n  database_id = DATABASE_ID  UND\n  snapshot_timestamp ZWISCHEN BEGIN_TIMEPOINT UND END_TIMEPOINT ;\n\nW\u00c4HLEN \n  SUM(calls) AS calls\nVON \n  pg_stat_history \nWO \n  queryid IST NICHT NULL UND\n  database_id =DATABASE_ID  UND\n  snapshot_timestamp ZWISCHEN BEGIN_TIMEPOINT UND END_TIMEPOINT UND \n  ( max_time &gt;= hist_current_min UND  max_time &lt; hist_current_max ) ;\n<\/code><\/pre>\n<pre>|-----------------------------------------------------------------------------------------------\n| MAX_TIME HISTOGRAMM\n| GESAMTE ANRUFE : 33851920\n| MINZEIT  : 00:00:01.063\n| MAXZEIT  : 00:02:01.869\n---------------------------------------------------------------------------------\n|                      min Dauer|                      max Dauer|     Anrufe\n+----------------------------------+----------------------------------+----------\n| 00:00:01.063(      1063.830 ms.) | 00:00:13.144(     13144.445 ms.) | 9\n| 00:00:13.144(     13144.445 ms.) | 00:00:25.225(     25225.060 ms.) | 0\n| 00:00:25.225(     25225.060 ms.) | 00:00:37.305(     37305.675 ms.) | 0\n| 00:00:37.305(     37305.675 ms.) | 00:00:49.386(     49386.290 ms.) | 0\n| 00:00:49.386(     49386.290 ms.) | 00:01:01.466(     61466.906 ms.) | 0\n| 00:01:01.466(     61466.906 ms.) | 00:01:13.547(     73547.521 ms.) | 0\n| 00:01:13.547(     73547.521 ms.) | 00:01:25.628(     85628.136 ms.) | 0\n| 00:01:25.628(     85628.136 ms.) | 00:01:37.708(     97708.751 ms.) | 4\n| 00:01:37.708(     97708.751 ms.) | 00:01:49.789(    109789.366 ms.) | 2\n| 00:01:49.789(    109789.366 ms.) | 00:02:01.869(    121869.981 ms.) | 0\n<\/pre>\n<h4>TOP10 Snapshots nach Abfrage pro Sekunde<\/h4>\n<p><b class=\"spoiler_title\">Abfragen<\/b><\/p>\n<pre><code class=\"plaintext\">--pg_qps.sql\n--Berechnung der Abfragen pro Sekunde \nCREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$\nDECLARE\n pg_stat_history_rec record ;\n prev_pg_stat_history_id integer ;\n prev_pg_stat_history_rec record;\n total_seconds double precision ;\n result double precision;\nBEGIN \n  result = 0 ;\n  \n  SELECT *\n  INTO pg_stat_history_rec\n  FROM \n    pg_stat_history\n  WHERE id = pg_stat_history_id ;\n\n  IF pg_stat_history_rec.snapshot_timestamp IS NULL \n  THEN\n    RAISE EXCEPTION 'FEHLER - pg_stat_history f\u00fcr id = % nicht gefunden',pg_stat_history_id;\n  END IF ;  \n  \n --RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id , \n pg_stat_history_rec.snapshot_timestamp ;\n  \n  SELECT \n    MAX(id)   \n  INTO\n    prev_pg_stat_history_id\n  FROM\n    pg_stat_history\n  WHERE \n    database_id = pg_stat_history_rec.database_id AND\n\tqueryid IS NULL AND\n\tid  0 \n  THEN\n    result = pg_stat_history_rec.calls \/ total_seconds ;\n  ELSE\n   result = 0 ; \n  END IF;\n   \n RETURN result ;\nEND\n$$ LANGUAGE plpgsql;\n\n\nSELECT \n  id , \n  snapshot_timestamp ,\n  calls , \t\n  total_time , \n  ( select pg_qps( id )) AS QPS ,\n  blk_read_time ,\n  blk_write_time\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND\n  ( select pg_qps( id )) IS NOT NULL \nORDER BY 5 DESC \nLIMIT 10\n<\/code><\/pre>\n<pre>|-----------------------------------------------------------------------------------------------\n| TOP10 Schnappsch\u00fcsse nach QueryPerSeconds-Zahlen geordnet\n-----------------------------------------------------------------------------------------------------------------------------------------------\n|    #|          Snapshot| SnapshotID|      Abrufe|                      Gesamt-Datenbankzeit|        QPS|                          I\/O-Zeit| I\/O-Zeit %\n+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------\n|    1|  04.04.2019 20:04|       4161|    5758631|  00:06:30.513(    390513.926 ms.)|   1573.396|  00:00:01.470(      1470.110 ms.)|       .376\n|    2|  04.04.2019 17:00|       4149|    3529197|  00:11:48.830(    708830.618 ms.)|    980.332|  00:12:47.834(    767834.052 ms.)|    108.324\n|    3|  04.04.2019 16:00|       4143|    3525360|  00:10:13.492(    613492.351 ms.)|    979.267|  00:08:41.396(    521396.555 ms.)|     84.988\n|    4|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134\n|    5|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732\n|    6|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009\n|    7|  04.04.2019 15:00|       4139|    2394416|  00:04:51.435(    291435.010 ms.)|    665.116|  00:00:12.025(     12025.895 ms.)|      4.126\n|    8|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024\n|    9|  05.04.2019 01:03|       4167|    4387191|  00:06:51.380(    411380.293 ms.)|    609.332|  00:05:18.847(    318847.407 ms.)|     77.507\n|   10|  04.04.2019 18:01|       4157|    1145596|  00:01:19.217(     79217.372 ms.)|    313.004|  00:00:01.319(      1319.676 ms.)|      1.666\n<\/pre>\n<h4>St\u00fcndlicher Ausf\u00fchrungsverlauf mit Abfragen pro Sekunde und I\/O-Zeit<\/h4>\n<p><b class=\"spoiler_title\">Abfrage<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  id , \n  snapshot_timestamp ,\n  calls , \t\n  total_time , \n  ( SELECT pg_qps( id )) AS QPS ,\n  blk_read_time ,\n  blk_write_time\nFROM \n  pg_stat_history\nWHERE \n  queryid IS NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nORDER BY 2\n<\/code><\/pre>\n<pre>|-----------------------------------------------------------------------------------------------\n| STUNDENVERLAUF DER AUSF\u00dcHRUNG  MIT QueryPerSeconds und I\/O-Zeit\n-----------------------------------------------------------------------------------------------------------------------------------------------\n| ABFRAGEPROTOKOLL PRO SEKUNDE\n|    #|          Schnappschuss| SchnappschussID|      Aufrufe|                      gesamte dbzeit|        QPS|                          I\/O-Zeit| I\/O-Zeit %\n+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------\n|    1|  04.04.2019 11:00|       4131|       3747|  00:00:00.835(       835.374 ms.)|      1.041|  00:00:00.000(          .000 ms.)|       .000\n|    2|  04.04.2019 12:00|       4133|    1002722|  00:01:52.419(    112419.376 ms.)|    278.534|  00:00:00.149(       149.105 ms.)|       .133\n|    3|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024\n|    4|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009\n|    5|  04.04.2019 15:00|       4139|    2394416|  00:04:51.435(    291435.010 ms.)|    665.116|  00:00:12.025(     12025.895 ms.)|      4.126\n|    6|  04.04.2019 16:00|       4143|    3525360|  00:10:13.492(    613492.351 ms.)|    979.267|  00:08:41.396(    521396.555 ms.)|     84.988\n|    7|  04.04.2019 17:00|       4149|    3529197|  00:11:48.830(    708830.618 ms.)|    980.332|  00:12:47.834(    767834.052 ms.)|    108.324\n|    8|  04.04.2019 18:01|       4157|    1145596|  00:01:19.217(     79217.372 ms.)|    313.004|  00:00:01.319(      1319.676 ms.)|      1.666\n|    9|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732\n|   10|  04.04.2019 20:04|       4161|    5758631|  00:06:30.513(    390513.926 ms.)|   1573.396|  00:00:01.470(      1470.110 ms.)|       .376\n|   11|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134\n|   12|  04.04.2019 23:03|       4165|    1443155|  00:01:34.467(     94467.539 ms.)|    200.438|  00:00:00.015(        15.287 ms.)|       .016\n|   13|  05.04.2019 01:03|       4167|    4387191|  00:06:51.380(    411380.293 ms.)|    609.332|  00:05:18.847(    318847.407 ms.)|     77.507\n|   14|  05.04.2019 02:03|       4171|     189852|  00:00:10.989(     10989.899 ms.)|     52.737|  00:00:00.539(       539.110 ms.)|      4.906\n|   15|  05.04.2019 03:01|       4173|       3627|  00:00:00.103(       103.000 ms.)|      1.042|  00:00:00.004(         4.131 ms.)|      4.010\n|   16|  05.04.2019 04:00|       4175|       3627|  00:00:00.085(        85.235 ms.)|      1.025|  00:00:00.003(         3.811 ms.)|      4.471\n|   17|  05.04.2019 05:00|       4177|       3747|  00:00:00.849(       849.454 ms.)|      1.041|  00:00:00.006(         6.124 ms.)|       .721\n|   18|  05.04.2019 06:00|       4179|       3747|  00:00:00.849(       849.561 ms.)|      1.041|  00:00:00.000(          .051 ms.)|       .006\n|   19|  05.04.2019 07:00|       4181|       3747|  00:00:00.839(       839.416 ms.)|      1.041|  00:00:00.000(          .062 ms.)|       .007\n|   20|  05.04.2019 08:00|       4183|       3747|  00:00:00.846(       846.382 ms.)|      1.041|  00:00:00.000(          .007 ms.)|       .001\n|   21|  05.04.2019 09:00|       4185|       3747|  00:00:00.855(       855.426 ms.)|      1.041|  00:00:00.000(          .065 ms.)|       .008\n|   22|  05.04.2019 10:00|       4187|       3797|  00:01:40.150(    100150.165 ms.)|      1.055|  00:00:21.845(     21845.217 ms.)|     21.812\n<\/pre>\n<h4>Text aller SQL-Abfragen<\/h4>\n<p><b class=\"spoiler_title\">Abfrage<\/b><\/p>\n<pre><code class=\"plaintext\">SELECT \n  queryid , \n  query \nFROM \n  pg_stat_history\nWHERE \n  queryid IS NOT NULL AND \n  database_id = DATABASE_ID  AND\n  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT\nGROUP BY queryid , query\n<\/code><\/pre>\n<h2>Zusammenfassung<\/h2>\n<p>\nWie man sieht, kann man mit relativ einfachen Mitteln eine Menge n\u00fctzlicher Informationen \u00fcber die Auslastung und den Zustand der Datenbank erhalten. <\/p>\n<p><b>Anmerkung:<\/b>Wenn man die queryid in den Abfragen protokolliert, erh\u00e4lt man die Historie f\u00fcr eine einzelne Abfrage (um Speicherplatz zu sparen, sind Berichte f\u00fcr einzelne Abfragen weggelassen).<\/p>\n<p>Die statistischen Daten zur Abfrageleistung sind vorhanden und werden gesammelt.<br \/>\nDie erste Phase der \"Datensammlung\" ist abgeschlossen.<\/p>\n<p>Jetzt k\u00f6nnen wir zur zweiten Phase \u2013 der \"Optimierung der Leistungskennzahlen\" \u2013 \u00fcbergehen.<br \/>\n<img decoding=\"async\" alt=\"\u00dcberwachung der Leistungsf\u00e4higkeit von PostgreSQL-Anfragen. Teil 1 \u2014 Berichterstattung\" src=\"\/wp-content\/uploads\/2019\/04\/a893e49280d4cb425e4667a5c51d2397.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Aber das ist schon eine ganz andere Geschichte.<\/b><\/p>\n<p><i>Die Fortsetzung folgt\u2026<\/i><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/icl_services\/blog\/446734\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b. \u0418\u043b\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0435. \u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438\u0447\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. Disclaimer of warranties: \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24168,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32353","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b. \u0418\u043b\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0435. \u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438\u0447\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. Disclaimer of warranties: \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 PostgreSQL. \u0427\u0430\u0441\u0442\u044c 1 \u2014 \u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043d\u0433 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b. \u0418\u043b\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0435. \u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438\u0447\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. Disclaimer of warranties: \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:46:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:46:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Leistungs\u00fcberwachung von PostgreSQL-Abfragen. Teil 1 \u2014 Berichterstattung | ProHoster","description":"Ingenieur \u2013 \u00fcbersetzt aus dem Lateinischen \u2013 bedeutet inspiriert. Ein Ingenieur kann alles. (c) R. Diesel. Epigraphen. Oder die Geschichte dar\u00fcber, warum ein Datenbankadministrator an seine Programmiererfahrungen zur\u00fcckdenken sollte. Vorwort Alle Namen sind ge\u00e4ndert. Zuf\u00e4llige \u00dcbereinstimmungen. Das Material stellt ausschlie\u00dflich die pers\u00f6nliche Meinung des Autors dar. Haftungsausschluss: In der geplanten Artikelreihe wird es keine detaillierte und pr\u00e4zise Beschreibung der verwendeten Tabellen geben.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 PostgreSQL. \u0427\u0430\u0441\u0442\u044c 1 \u2014 \u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043d\u0433 | ProHoster","og:description":"\u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u2014 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441 \u043b\u0430\u0442\u044b\u043d\u0438 \u2014 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439. \u0418\u043d\u0436\u0435\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451. (\u0441) \u0420.\u0414\u0438\u0437\u0435\u043b\u044c. \u042d\u043f\u0438\u0433\u0440\u0430\u0444\u044b. \u0418\u043b\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0435. \u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438\u0447\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. Disclaimer of warranties: \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/monitoring-proizvoditelnosti-zaprosov-postgresql-chast-1-reporting","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:46:32+00:00","article:modified_time":"2019-10-31T18:46:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32353","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 10:28:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:13:42","updated":"2026-01-21 10:28:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=32353"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32353\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24168"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}