„PostgreSQL“ užklausų planų supratimas dar patogiau

Prieš pusę metų pristatėme paaiškinti.tensor.ru - viešas paslauga, skirta analizuoti ir vizualizuoti užklausų planus į PostgreSQL.

„PostgreSQL“ užklausų planų supratimas dar patogiau

Per pastaruosius mėnesius mes apie jį rašėme ataskaita PGConf.Russia 2020 m, parengė santrauką Straipsnis apie SQL užklausų pagreitinimą remdamiesi pateiktomis rekomendacijomis... bet svarbiausia, surinkome jūsų atsiliepimus ir išnagrinėjome realius naudojimo atvejus.

O dabar esame pasirengę kalbėti apie naujas galimybes, kuriomis galite pasinaudoti.

Įvairių planų formatų palaikymas

Planas iš žurnalo kartu su prašymu

Tiesiogiai iš konsolės pasirinkite visą bloką, pradedant nuo eilutės su Užklausos tekstas, su visomis pirmaujančiomis erdvėmis:

        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)

... ir įdėti viską, nukopijuotą tiesiai į plano lauką, nieko neatskirdami:

„PostgreSQL“ užklausų planų supratimas dar patogiau

Pabaigoje gauname premiją prie išardyto plano ir "kontekstas" skirtukas, kur mūsų prašymas pateikiamas visoje savo šlovėje:

„PostgreSQL“ užklausų planų supratimas dar patogiau

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

Arba su išorinėmis kabutėmis, kaip pgAdmin kopijomis, arba be jos - metame į tą patį lauką, o išvestis yra grožis:

„PostgreSQL“ užklausų planų supratimas dar patogiau

Išplėstinė vizualizacija

Planavimo laikas / vykdymo laikas

Dabar galite geriau matyti, kur buvo praleistas papildomas laikas vykdant užklausą:

„PostgreSQL“ užklausų planų supratimas dar patogiau

I/O laikas

Kartais tenka susidurti su situacija, kai, kalbant apie išteklius, atrodo, kad perskaityta ir parašyta ne per daug, bet vykdymo laikas atrodo nederamai ilgas.

Čia turime pasakyti: "O, tikriausiai tuo metu serverio diskas buvo per daug perkrautas, todėl skaitymas užtruko taip ilgai!"Bet kažkaip tai nėra labai tikslu...

Bet tai galima nustatyti visiškai patikimai. Faktas yra tas, kad tarp PG serverio konfigūravimo parinkčių yra track_io_timing:

Įgalina įvesties / išvesties operacijų laiką. Ši parinktis pagal numatytuosius nustatymus yra išjungta, nes reikia nuolat teirautis operacinėje sistemoje dabartinio laiko, o tai gali žymiai sulėtinti kai kurių platformų našumą. Norėdami apskaičiuoti laiko sąnaudas savo platformoje, galite naudoti pg_test_timing įrankį. Įvesties / išvesties statistiką galima gauti naudojant pg_stat_database rodinį, EXPLAIN išvestyje (kai naudojamas parametras BUFFERS) ir per pg_stat_statements rodinį.

Šią parinktį taip pat galima įjungti vietinės sesijos metu:

SET track_io_timing = TRUE;

Na, o dabar geriausia yra tai, kad mes išmokome suprasti ir rodyti šiuos duomenis atsižvelgdami į visas vykdymo medžio transformacijas:

„PostgreSQL“ užklausų planų supratimas dar patogiau

Čia matote, kad iš 0.790 ms viso vykdymo laiko, 0.718 ms užtruko perskaityti vieną duomenų puslapį, 0.044 ms užtruko jį parašyti ir tik 0.028 ms buvo išleista visai kitai naudingai veiklai!

Ateitis su PostgreSQL 13

Galite rasti visą naujovių apžvalgą detaliame straipsnyje, o mes konkrečiai kalbame apie planų pokyčius.

Planavimo buferiai

Planuokliui skirtų išteklių apskaita atsispindi kitame pataisyme, nesusijusiame su pg_stat_statements. EXPLAIN su parinktimi BUFFERIAI praneš apie buferių, naudojamų planavimo etape, skaičių:

 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

„PostgreSQL“ užklausų planų supratimas dar patogiau

Laipsniškas rūšiavimas

Tais atvejais, kai reikia rūšiuoti daugybe raktų (k1, k2, k3...), planuotojas dabar gali pasinaudoti žiniomis, kad duomenys jau surūšiuoti keliuose pirmuosiuose raktuose (pavyzdžiui, k1 ir k2). Tokiu atveju negalite iš naujo rūšiuoti visų duomenų, o suskirstyti juos į grupes, kurių k1 ir k2 reikšmės yra vienodos, ir „perrūšiuoti“ raktu k3.

Taigi visas rūšiavimas yra padalintas į keletą nuoseklių mažesnių dydžių rūšių. Tai sumažina reikalingos atminties kiekį ir leidžia išvesti pirmuosius duomenis prieš baigiant rūšiavimą.

 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

„PostgreSQL“ užklausų planų supratimas dar patogiau
„PostgreSQL“ užklausų planų supratimas dar patogiau

UI/UX patobulinimai

Ekrano kopijos, jos yra visur!

Dabar kiekviename skirtuke yra galimybė greitai nufotografuokite skirtuko ekrano kopiją į mainų sritį visas skirtuko plotis ir gylis - "vaizdas" dešinėje viršuje:

„PostgreSQL“ užklausų planų supratimas dar patogiau

Tiesą sakant, dauguma šio leidinio nuotraukų buvo gautos tokiu būdu.

Rekomendacijos dėl mazgų

Jų ne tik padaugėjo, bet ir apie kiekvieną galima kalbėti išsamiai perskaitykite straipsnįsekant nuorodą:

„PostgreSQL“ užklausų planų supratimas dar patogiau

Ištrinama iš archyvo

Kai kurie žmonės tikrai prašė pridėti parinktį ištrinti "visiškai" net planus, kurie nėra paskelbti archyve – tiesiog spustelėkite atitinkamą piktogramą:

„PostgreSQL“ užklausų planų supratimas dar patogiau

Na, nepamirškite, kad mes turime Paramos grupe, kur galite rašyti savo pastabas ir pasiūlymus.

Šaltinis: www.habr.com

Pirkite patikimą prieglobą svetainėms su DDoS apsauga, VPS VDS serveriais 🔥 Įsigykite patikimą svetainių talpinimą su DDoS apsauga, VPS VDS serveriais | ProHoster