PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

Vor sechs Monaten haben wir vorgestellt explain.tensor.ru — einen öffentlichen Dienst zur Analyse und Visualisierung von AbfrageplĂ€nen fĂŒr PostgreSQL.

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

In den vergangenen Monaten haben wir darĂŒber auf der PGConf.Russia 2020 einen Bericht, einen zusammenfassenden Artikel zur Beschleunigung von SQL-Abfragen auf der Grundlage der Empfehlungen, die er liefert
 aber das Wichtigste ist, dass wir Ihr Feedback gesammelt und die realen AnwendungsfĂ€lle verfolgt haben.

Und jetzt sind wir bereit, ĂŒber die neuen Möglichkeiten zu berichten, die Sie nutzen können.

UnterstĂŒtzung verschiedener Planformatierungen

Plan aus dem Log, zusammen mit der Anfrage

Markieren Sie direkt aus der Konsole den gesamten Block, beginnend mit der Zeile mit Query Text, mit allen fĂŒhrenden Leerzeichen:

        Query Text: INSERT INTO dicquery_20200604 VALUES ($1.*) ON CONFLICT (query)
                           DO NOTHING;
        Insert on dicquery_20200604 (cost=0.00..0.05 rows=1 width=52) (actual time=40.376..40.376 rows=0 loops=1)
          Conflict Resolution: NOTHING
          Conflict Arbiter Indexes: dicquery_20200604_pkey
          Tuples Inserted: 1
          Conflicting Tuples: 0
          Buffers: shared hit=9 read=1 dirtied=1
          -> Result (cost=0.00..0.05 rows=1 width=52) (actual time=0.001..0.001 rows=1 loops=1)


 und fĂŒgen alles kopierte direkt ins Planfeld ein, ohne es zu trennen:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

Am Ende erhalten wir zusĂ€tzlich zum zerlegten Plan auch einen Tab „Kontext“, in dem unsere Anfrage in vollem Umfang dargestellt ist:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

JSON und YAML

EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM pg_class;

"[
  {
    "Plan": {
      "Node Type": "Seq Scan",
      "Parallel Aware": false,
      "Relation Name": "pg_class",
      "Alias": "pg_class",
      "Startup Cost": 0.00,
      "Total Cost": 1336.20,
      "Plan Rows": 13804,
      "Plan Width": 539,
      "Actual Startup Time": 0.006,
      "Actual Total Time": 1.838,
      "Actual Rows": 10266,
      "Actual Loops": 1,
      "Shared Hit Blocks": 646,
      "Shared Read Blocks": 0,
      "Shared Dirtied Blocks": 0,
      "Shared Written Blocks": 0,
      "Local Hit Blocks": 0,
      "Local Read Blocks": 0,
      "Local Dirtied Blocks": 0,
      "Local Written Blocks": 0,
      "Temp Read Blocks": 0,
      "Temp Written Blocks": 0
    },
    "Planning Time": 5.135,
    "Triggers": [
    ],
    "Execution Time": 2.389
  }
]"

Ob mit Ă€ußeren AnfĂŒhrungszeichen, wie pgAdmin es kopiert, oder ohne — werfen wir es in dasselbe Feld, am Ende — eine Schönheit:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

Erweiterte Visualisierung

Planungszeit / AusfĂŒhrungszeit

Jetzt ist besser zu erkennen, wo die zusĂ€tzliche Zeit bei der AusfĂŒhrung der Abfrage geblieben ist:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

I/O-Zeitmessung

Manchmal findet man sich in der Situation wieder, dass im Plan zwar nicht allzu viele Ressourcen gelesen oder geschrieben werden, aber die AusfĂŒhrungszeit irgendwie unangemessen hoch ist.

Hier muss gesagt werden: "Oh, wahrscheinlich war die Festplatte auf dem Server in diesem Moment zu stark belastet, daher hat das Lesen so lange gedauert!" Aber das ist nicht besonders prÀzise


Aber man kann das absolut zuverlÀssig feststellen. Denn unter den Konfigurationsoptionen des PG-Servers gibt es track_io_timing:

Beinhaltet die Messung der Ein-/Ausgabezeiten. Diese Option ist standardmĂ€ĂŸig deaktiviert, da es erforderlich ist, die aktuelle Zeit stĂ€ndig vom Betriebssystem abzufragen, was die Leistung auf einigen Plattformen erheblich verlangsamen kann. Um die Kosten der Zeitmessung auf Ihrer Plattform zu bewerten, können Sie das Tool pg_test_timing verwenden. Statistiken zur Ein-/Ausgabe können ĂŒber die Ansicht pg_stat_database abgerufen werden, im EXPLAIN-Ausgabe (wenn die Option BUFFERS verwendet wird), und ĂŒber die Ansicht pg_stat_statements.

Diese Option kann auch in einer lokalen Sitzung aktiviert werden:

SET track_io_timing = TRUE;

Jetzt kommt das Beste: Wir haben gelernt, diese Daten zu verstehen und darzustellen, wobei wir alle Transformationen des AusfĂŒhrungsbaums berĂŒcksichtigen:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

Hier kann man sehen, dass von 0,790 ms GesamtausfĂŒhrungszeit 0,718 ms fĂŒr das Lesen einer Datenseite benötig wurden, 0,044 ms fĂŒr das Schreiben derselben, und fĂŒr alle anderen nĂŒtzlichen AktivitĂ€ten wurden insgesamt nur 0,028 ms aufgewendet!

Die Zukunft mit PostgreSQL 13

Eine vollstĂ€ndige Übersicht der Neuerungen finden Sie in einem ausfĂŒhrlichen Artikel, und wir konzentrieren uns speziell auf die Änderungen in den PlĂ€nen.

Planungs-Buffer

Die Ressourcenzuteilung fĂŒr den Planner fand ihren Ausdruck in einem weiteren Patch, der nicht zu pg_stat_statements gehört. EXPLAIN mit der Option BUFFERS wird die Anzahl der wĂ€hrend der Planungsphase verwendeten Puffer melden:

 Seq Scan auf pg_class (tatsÀchliche Zeilen=386 Schleifen=1)
   Puffer: gemeinsamer Treffer=9 gelesen=4
 Planungszeit: 0,782 ms
   Puffer: gemeinsamer Treffer=103 gelesen=11
 AusfĂŒhrungszeit: 0,219 ms

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

Inkrementelle Sortierung

In FĂ€llen, in denen eine Sortierung nach mehreren SchlĂŒsseln (k1, k2, k3
) erforderlich ist, kann der Planner jetzt das Wissen nutzen, dass die Daten bereits nach mehreren der ersten SchlĂŒssel (z. B. k1 und k2) sortiert sind. In diesem Fall muss nicht mehr alles neu sortiert werden, sondern die Daten können in aufeinanderfolgende Gruppen mit gleichen Werten fĂŒr k1 und k2 unterteilt und nach dem SchlĂŒssel k3 "nachsortiert" werden.

Somit zerfĂ€llt die gesamte Sortierung in mehrere aufeinanderfolgende Sortierungen kleinerer GrĂ¶ĂŸe. Dies reduziert den benötigten Speicherbedarf und ermöglicht es zudem, die ersten Daten frĂŒher auszugeben, bevor die gesamte Sortierung vollstĂ€ndig ausgefĂŒhrt wurde.

 Inkrementelle Sortierung (tatsÀchliche Zeilen=2.949.857 Schleifen=1)
   SortierschlĂŒssel: ticket_no, passenger_id
   Vorgeordneter SchlĂŒssel: ticket_no
   Vollsortiergruppen: 92.184 Sortiermethode: Quicksort Speicher: avg=31kB peak=31kB
   ->  Index-Scan mit tickets_pkey auf tickets (tatsÀchliche Zeilen=2.949.857 Schleifen=1)
 Planungszeit: 2,137 ms
 AusfĂŒhrungszeit: 2230,019 ms

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen
PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

UI/UX Verbesserungen

Screenshots, sie sind ĂŒberall!

Jetzt gibt es auf jeder Registerkarte die Möglichkeit, schnell einen Screenshot der Registerkarte in die Zwischenablage in voller Breite und Tiefe der Registerkarte — "Ziel" rechts oben:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

TatsĂ€chlich wurden die meisten Bilder fĂŒr diese Veröffentlichung genau so erhalten.

Empfehlungen zu den Knoten

Es gibt nicht nur mehr, sondern man kann auch zu jedem detaillierte Informationen im Artikel nachlesen, indem Sie dem Link folgen:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

Löschen aus dem Archiv

Einige haben dringend gebeten, die Möglichkeit hinzuzufĂŒgen, es "vollstĂ€ndig" zu löschen, sogar nicht veröffentlichte PlĂ€ne im Archiv — bitte, ein einfaches Klicken auf das entsprechende Symbol genĂŒgt:

PostgreSQL-Abfragen noch benutzerfreundlicher verstehen

Nun, und vergessen wir nicht, dass wir eine Support-Gruppe haben,, an die man seine Anmerkungen und VorschlÀge senden kann.

Quelle: habr.com

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster