Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

För sex mĂ„nader sedan presenterade vi explain.tensor.ru — en offentlig tjĂ€nst för att analysera och visualisera frĂ„geplaner för PostgreSQL.

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

Under de senaste mÄnaderna har vi gjort en rapport om den pÄ PGConf.Russia 2020, förberett en sammanfattande artikel om optimering av SQL-frÄgor baserat pÄ rekommendationer som den ger... men viktigast av allt har vi samlat era feedback och observerat verkliga anvÀndningsfall.

Och nu Àr vi redo att berÀtta om de nya funktionerna som ni kan anvÀnda.

Stöd för olika planformat

Plan frÄn loggen, tillsammans med frÄgan

Direkt frÄn konsolen markerar vi hela blocket, som börjar frÄn raden med Query Text, med alla ledande mellanslag:

        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)


 och vi kastar allt kopierat direkt in i fĂ€ltet för planen, utan att dela upp nĂ„got:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

Resultatet ger oss ett bonus till den analyserade planen, plus fliken "kontext", dÀr vÄr frÄga presenteras i all sin prakt:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

JSON och 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
  }
]"

Oavsett om den har yttre citattecken, som pgAdmin kopierar, eller inte – vi kastar in det i samma fĂ€lt, sĂ„ fĂ„r vi det Ă€ndĂ„ vackert:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

Utökad visualisering

Planning Time / Execution Time

Nu Àr det tydligare var den extra tiden gick vid frÄgekörning:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

I/O Timing

Ibland stöter man pÄ en situation dÀr det i planen verkar som att det inte lÀsts eller skrivits sÀrskilt mycket resurser, men att körningstiden Àr orimligt lÄng.

HÀr mÄste man sÀga: "Oj, kanske var disken pÄ servern för överbelastad vid det tillfÀllet, sÄ det tog sÄ lÄng tid att lÀsa!" Men det Àr inte riktigt exakt...

Men man kan avgöra det helt pÄlitligt. PoÀngen Àr att bland PG-serverns konfigurationsalternativ finns det track_io_timing:

Inkluderar mÀtning av tid för in- och utdataoperationer. Denna parameter Àr som standard avstÀngd, eftersom det krÀver att det aktuella tidpunkten kontinuerligt frÄgas frÄn operativsystemet, vilket kan försena arbetet betydligt pÄ vissa plattformar. För att bedöma mÀtningskostnaderna pÄ din plattform kan du anvÀnda verktyget pg_test_timing. Statistik för in- och utdata kan erhÄllas genom vyerna pg_stat_database, i utdata frÄn EXPLAIN (nÀr parametern BUFFERS anvÀnds) och genom vyerna pg_stat_statements.

Denna parameter kan ocksÄ aktiveras inom en lokal session:

SET track_io_timing = TRUE;

Nu kommer det trevligaste — vi har lĂ€rt oss att förstĂ„ och visa dessa data med hĂ€nsyn till alla transformationer av exekveringstrĂ€det:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

HÀr kan vi se att av 0.790 ms av den totala exekveringstiden tog lÀsningen av en databas sida 0.718 ms, skrivningen av densamma 0.044 ms, och hela den övriga nyttiga aktiviteten kostade endast 0.028 ms!

Framtiden med PostgreSQL 13

Du kan bekanta dig med den fullstÀndiga översikten av nyheterna i en detaljerad artikel, men vi pratar specifikt om Àndringarna i planerna.

Planeringsbuffertar

Redovisningen av resurser som tilldelas planeringsarenan har fÄtt sitt uttryck Àven i en annan patch som inte Àr relaterad till pg_stat_statements. EXPLAIN med alternativet BUFFERS kommer att rapportera antalet buffertar som anvÀnts under planeringssteget:

 Seq Scan on pg_class (actual rows=386 loops=1)
Buffers: shared hit=9 read=4
Planning Time: 0.782 ms
Buffers: shared hit=103 read=11
Execution Time: 0.219 ms

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

Inkrementell sortering

I de fall dÀr sortering efter mÄnga nycklar (k1, k2, k3...) Àr nödvÀndig, kan planören nu utnyttja kunskapen om att data redan Àr sorterade efter flera av de första nycklarna (till exempel k1 och k2). I detta fall kan man undvika att om-sortera alla data igen, utan i stÀllet dela upp dem i sekventiella grupper med samma vÀrden för k1 och k2, och "delsortera" efter nyckeln k3.

PÄ sÄ sÀtt bryts hela sorteringen ner i flera sekventiella sorteringar av mindre storlek. Detta minskar den nödvÀndiga minnesmÀngden och gör det ocksÄ möjligt att returnera de första data snabbare Àn nÀr hela sorteringen Àr klar.

 Incremental Sort (actual rows=2949857 loops=1)
Sort Key: ticket_no, passenger_id
Presorted Key: ticket_no
Full-sort Groups: 92184 Sort Method: quicksort Memory: avg=31kB peak=31kB
-> Index Scan using tickets_pkey on tickets (actual rows=2949857 loops=1)
Planning Time: 2.137 ms
Execution Time: 2230.019 ms

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare
Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

FörbÀttringar av UI/UX

SkÀrmdumpar, de finns överallt!

Nu finns det en möjligheten att snabbt ta en skĂ€rmdump av fliken till urklipp i full bredd och djup av fliken — "siktet" uppe till höger:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

Faktiskt har de flesta bilderna för denna publikation erhÄllits just pÄ det sÀttet.

Rekommendationer pÄ noder

Det har inte bara blivit fler, utan man kan ocksÄ lÀsa mer detaljerat om varje i artikeln, genom att följa lÀnken:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

Borttagning frÄn arkivet

MĂ„nga har bett om att lĂ€gga till möjligheten att "ta bort helt" Ă€ven de icke-publicerade planerna i arkivet — det rĂ€cker att trycka pĂ„ den motsvarande ikonen:

Vi gör planering av PostgreSQL-förfrÄgningar Ànnu smidigare

NÄvÀl, och glöm inte att vi har en supportgrupp, dit ni kan skriva era kommentarer och förslag.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster