PostgreSQL vaicājumu plānu izpratne vēl ērtāka

Pirms pusgada mēs prezentējām paskaidrojiet.tensor.ru - publiska pakalpojums vaicājumu plānu parsÄ“Å”anai un vizualizÄ“Å”anai uz PostgreSQL.

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

Pēdējo mēneÅ”u laikā mēs esam stāstÄ«juÅ”i par viņu ziņojums PGConf.Russia 2020, sagatavoja kopsavilkumu rakstu par SQL vaicājumu paātrināŔanu pamatojoties uz tā sniegtajiem ieteikumiem... bet pats galvenais, mēs apkopojām jÅ«su atsauksmes un izskatÄ«jām reālus lietoÅ”anas gadÄ«jumus.

Un tagad mēs esam gatavi runāt par jaunām iespējām, kuras varat izmantot.

Atbalsts dažādiem plānu formātiem

Plāns no žurnāla kopā ar pieprasījumu

TieÅ”i no konsoles atlasiet visu bloku, sākot no rindas ar Vaicājuma teksts, ar visām sākuma atstarpēm:

        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)

... un ievietojiet visu nokopēto tieÅ”i plāna laukā, neko neatdalot:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

Beigās saņemam bonusu pie izjauktā plāna un cilne "konteksts"., kur mÅ«su lÅ«gums tiek pasniegts visā tās krāŔņumā:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

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

Vai nu ar ārējām pēdiņām, kā pgAdmin kopijas, vai bez - mēs to iemetam tajā paŔā laukā, un rezultāts ir skaistums:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

Uzlabota vizualizācija

PlānoŔanas laiks/Izpildes laiks

Tagad varat labāk redzēt, kur tika pavadīts papildu laiks vaicājuma izpildei:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

I/O laiks

Dažkārt nākas saskarties ar situāciju, kad resursu ziņā Ŕķiet, ka nav izlasÄ«ts un uzrakstÄ«ts pārāk daudz, bet izpildes laiks Ŕķiet nesaskaņoti garÅ”.

Å eit mums jāsaka: "Ak, droÅ”i vien tajā brÄ«dÄ« servera disks bija pārāk pārslogots, tāpēc lasÄ«Å”ana prasÄ«ja tik ilgu laiku!"Bet kaut kā tas nav ļoti precÄ«zi...

Bet to var noteikt pilnīgi droŔi. Fakts ir tāds, ka starp PG servera konfigurācijas opcijām ir track_io_timing:

Iespējo I/O operāciju laiku. Å Ä« opcija pēc noklusējuma ir atspējota, jo tai ir nepārtraukti jājautā operētājsistēmai paÅ”reizējais laiks, kas dažās platformās var ievērojami palēnināt veiktspēju. Lai novērtētu laika noteikÅ”anas izmaksas savā platformā, varat izmantot utilÄ«tu pg_test_timing. I/O statistiku var iegÅ«t, izmantojot pg_stat_database skatu, izejā EXPLAIN (ja tiek izmantots parametrs BUFFERS) un izmantojot pg_stat_statements skatu.

Šo opciju var iespējot arī vietējā sesijā:

SET track_io_timing = TRUE;

Tagad labākais ir tas, ka mēs esam iemācÄ«juÅ”ies saprast un parādÄ«t Å”os datus, ņemot vērā visas izpildes koka transformācijas:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

Å eit var redzēt, ka no 0.790 ms no kopējā izpildes laika vienas datu lapas lasÄ«Å”ana aizņēma 0.718 ms, rakstÄ«Å”ana aizņēma 0.044 ms un tikai 0.028 ms tika iztērēti visām pārējām noderÄ«gajām darbÄ«bām!

Nākotne ar PostgreSQL 13

Jūs varat atrast pilnu inovāciju pārskatu detalizētā rakstā, un mēs konkrēti runājam par izmaiņām plānos.

PlānoŔanas buferi

Plānotājam pieŔķirto resursu uzskaite ir atspoguļota citā ielāpā, kas nav saistÄ«ts ar pg_stat_statements. EXPLAIN ar opciju BUFFERI ziņos par plānoÅ”anas fāzē izmantoto buferu skaitu:

 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 vaicājumu plānu izpratne vēl ērtāka

Pakāpeniska ŔķiroŔana

GadÄ«jumos, kad ir nepiecieÅ”ama ŔķiroÅ”ana pēc daudzām atslēgām (k1, k2, k3...), plānotājs tagad var izmantot zināŔanas, ka dati jau ir sakārtoti pēc vairākām pirmajām atslēgām (piemēram, k1 un k2). Å ajā gadÄ«jumā jÅ«s nevarat atkārtoti kārtot visus datus, bet sadalÄ«t tos secÄ«gās grupās ar vienādām k1 un k2 vērtÄ«bām un ā€œpārkārtotā€ pēc atslēgas k3.

Tādējādi visa ŔķiroÅ”ana ir sadalÄ«ta vairākos secÄ«gos mazāka izmēra veidos. Tas samazina vajadzÄ«gās atmiņas apjomu un ļauj arÄ« izvadÄ«t pirmos datus, pirms visa ŔķiroÅ”ana ir pabeigta.

 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 vaicājumu plānu izpratne vēl ērtāka
PostgreSQL vaicājumu plānu izpratne vēl ērtāka

UI/UX uzlabojumi

Ekrānuzņēmumi, tie ir visur!

Tagad katrā cilnē ir iespēja ātri uzņemiet cilnes ekrānuzņēmumu starpliktuvē viss cilnes platums un dziļums - "skats" labajā augŔējā stÅ«rÄ«:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

PatiesÄ«bā lielākā daļa attēlu Å”ai publikācijai tika iegÅ«ti Ŕādā veidā.

Ieteikumi par mezgliem

Viņu ne tikai kļuvis vairāk, bet par katru var arī runāt izlasi rakstu sīkāksekojot saitei:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

Notiek dzēŔana no arhīva

Daži cilvēki patieŔām lÅ«dza pievienot Å”o opciju dzēst "pilnÄ«bā" pat plāni, kas nav publicēti arhÄ«vā - lÅ«dzu, vienkārÅ”i noklikŔķiniet uz atbilstoŔās ikonas:

PostgreSQL vaicājumu plānu izpratne vēl ērtāka

Nu, neaizmirstiet, ka mums ir Atbalsta grupa, kur varat rakstīt savus komentārus un ieteikumus.

Avots: www.habr.com

Pievieno komentāru