E kuptojmë planet e kërkesave PostgreSQL më lehtë

GjatĂ« gjashtĂ« muajve tĂ« fundit ne paraqitĂ«m explain.tensor.ru — shĂ«rbimi publik pĂ«r analizimin dhe vizualizimin e ploteve tĂ« pyetjeve pĂ«r PostgreSQL.

E kuptojmë planet e kërkesave PostgreSQL më lehtë

GjatĂ« muajve tĂ« kaluar kemi bĂ«rĂ« njĂ« raport pĂ«r tĂ« nĂ« PGConf.Russia 2020, pĂ«rgatitĂ«m njĂ« artikul pĂ«r pĂ«rshpejtimin e kĂ«rkesave SQL tĂ« bazuar nĂ« rekomandimet qĂ« ai jep
 por mĂ« e rĂ«ndĂ«sishmja — mbledhĂ«m reagimet tuaja dhe ndoqĂ«m rastet reale tĂ« pĂ«rdorimit.

Dhe tani jemi të gatshëm të flasim për mundësitë e reja që mund të përdorni.

Mbështetje për formate të ndryshme të planeve

Plani nga logu, së bashku me kërkesën

Direkt nga konsola, përzgjidhim tërë bllokun, duke filluar nga rreshti me Query Text, me të gjithë hapësirat e para:

        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)
          Konflikti Zgjidhja: NOTHING
          Indexet për Zgjidhjen e Konflikteve: dicquery_20200604_pkey
          Tupla të Shtuar: 1
          Tupla Konfliktuese: 0
          Buffers: shared hit=9 read=1 dirtied=1
          ->  Rezultati  (cost=0.00..0.05 rows=1 width=52) (actual time=0.001..0.001 rows=1 loops=1)


 dhe hedhim gjithçka tĂ« kopjuar direkt nĂ« fushĂ«n pĂ«r planin, asgjĂ« pa u Ndara:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

Në përfundim, marrim si bonus për planin e analizuar edhe tabin "kontekst", ku kërkesa jonë paraqitet në gjithë shkëlqimin e saj:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

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

PavarĂ«sisht nĂ«se me thonjĂ«za tĂ« jashtme, siç kopjon pgAdmin, apo pa — hedhin nĂ« tĂ« njĂ«jtĂ«n fushĂ«, rezultati — bukuri:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

Vizualizimi i avancuar

Koha e Planifikimit / Koha e Ekzekutimit

Tani është më e dukshme se ku po shpenzohej koha shtesë gjatë ekzekutimit të kërkesës:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

I/O Timing

Ndonjëherë na duhet të përballemi me situatën kur në plan duket se burimet janë lexuar-shkruar jo shumë, por koha e ekzekutimit duket të jetë ndonjëherë e madhe.

Këtu duhet të themi: "Ooo, ndoshta në atë moment disku në server ishte shumë i ngarkuar, prandaj po lexohej kaq ngadalë!" Por kjo nuk është shumë e saktë...

Por mund ta përcaktojmë absolutisht saktë. Problemi është se ndër opsionet e konfigurimit të serverit PG është track_io_timing:

Përfshin matjen e kohës së operacioneve të hyrjes/daljes. Ky parametr është i çaktivizuar si fillim, sepse kërkon kërkimin e vazhdueshëm të kohës aktuale nga sistemi operativ, gjë që mund të ngadalësojë ndjeshëm performancën në disa platforma. Për të vlerësuar shpenzimet e matjes së kohës në platformën tuaj, mund të përdorni utilitarin pg_test_timing. Statistikën e hyrjes/daljes mund ta merrni përmes shikimit pg_stat_database, në daljen EXPLAIN (kur përdoret parametri BUFFERS) dhe përmes shikimit pg_stat_statements.

Ky parametr mund të aktivizohet gjithashtu brenda një seance lokale:

SET track_io_timing = TRUE;

Tani, pjesa mĂ« e kĂ«ndshme — kemi mĂ«suar tĂ« kuptojmĂ« dhe tĂ« paraqesim kĂ«to tĂ« dhĂ«na duke marrĂ« parasysh tĂ« gjitha transformimet e pemĂ«s sĂ« ekzekutimit:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

KĂ«tu mund tĂ« vĂ«rehet se nga 0.790ms tĂ« gjithĂ« kohĂ«s sĂ« ekzekutimit, 0.718ms u mor nga leximi i njĂ« faqeje tĂ« dhĂ«nash, 0.044ms — nga shkarkimi i saj, dhe pĂ«r tĂ« gjithĂ« aktivitetin e mbetur u pĂ«rdorĂ«n vetĂ«m 0.028ms!

E ardhmja me PostgreSQL 13

Mund të njihni një përmbledhje të plotë të noviteteve në një artikull të detajuar, dhe ne konkretisht flasim për ndryshimet në planet.

Planifikimi i bufereve

Llogaritja e burimeve të alokuara për planifikuesin është reflektuar po ashtu në një patch tjetër, që nuk i përket pg_stat_statements. EXPLAIN me opsionin BUFFERS do të raportojë numrin e bufereve të përdorura gjatë fazës së planifikimit:

 Seq Scan on pg_class (rreshtat aktuale=386 loops=1)
   Bufere: shared hit=9 read=4
 Koha e Planifikimit: 0.782 ms
   Bufere: shared hit=103 read=11
 Koha e Ekzekutimit: 0.219 ms

E kuptojmë planet e kërkesave PostgreSQL më lehtë

Sortimi inkremental

NĂ« rastet kur kĂ«rkohet njĂ« renditje sipas shumĂ« çelĂ«save (k1, k2, k3
), planifikuesi tani mund tĂ« shfrytĂ«zojĂ« njohuritĂ« qĂ« tĂ« dhĂ«nat janĂ« tashmĂ« tĂ« renditura sipas disa nga çelĂ«sat e parĂ« (p.sh. k1 dhe k2). NĂ« kĂ«tĂ« rast, nuk Ă«shtĂ« e nevojshme tĂ« ripĂ«rfshihet tĂ« gjithĂ« tĂ« dhĂ«nat, por mund tĂ« ndahen ato nĂ« grupe tĂ« renditura nĂ« mĂ«nyrĂ« sekondere sipas vlerave tĂ« ngjashme k1 dhe k2, dhe tĂ« “pĂ«rfundojĂ«â€ sipas çelĂ«sit k3.

Në këtë mënyrë, tërë renditja ndahet në disa renditje të vogla. Kjo redukton sasinë e memories së nevojshme, dhe gjithashtu lejon që të dhënat e para të jepen më herët, para se të përfundojë e tërë renditja.

 Incremental Sort (rreshtat aktuale=2949857 loops=1)
   ÇelĂ«si i Renditjes: ticket_no, passenger_id
   ÇelĂ«si i Pararenditur: ticket_no
   Grupi tërësor të renditjes: 92184 Metoda e Renditjes: quicksort Memoria: avg=31kB peak=31kB
   ->  Indeks Skano duke përdorur tickets_pkey në tickets (rreshtat aktuale=2949857 loops=1)
 Koha e Planifikimit: 2.137 ms
 Koha e Ekzekutimit: 2230.019 ms

E kuptojmë planet e kërkesave PostgreSQL më lehtë
E kuptojmë planet e kërkesave PostgreSQL më lehtë

Përmirësime të UI/UX

Kapsht, ata janë kudo!

Tani, nĂ« çdo skedĂ« Ă«shtĂ« shtuar mundĂ«sia pĂ«r tĂ« shpejt bĂ«j njĂ« screenshot tĂ« skedĂ«s nĂ« clipboard nĂ« tĂ« gjithĂ« gjerĂ«sinĂ« dhe thellĂ«sinĂ« e skedĂ«s — «sinkronizimi» nĂ« tĂ« djathtĂ«n-lart:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

Në fakt, shumica e imazheve për këtë publikim janë marrë pikërisht kështu.

Rekomandimet në nyje

Jo vetëm që janë rritur numri i tyre, por për secilën mund të lexoni në detaje në artikull, duke kaluar nëpër lidhjen:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

Fshirja nga arkiva

Disa kĂ«rkuan shumĂ« qĂ« tĂ« shtohej mundĂ«sia pĂ«r tĂ« fshirĂ« "pĂ«rfundimisht" edhe planet qĂ« nuk publikohen nĂ« arkiv — ju lutemi, mjafton tĂ« klikoni ikonen pĂ«rkatĂ«se:

E kuptojmë planet e kërkesave PostgreSQL më lehtë

Po ashtu, mos haroni se kemi një grup mbështetjeje, ku mund të dërgoni sugjerimet dhe vlerësimet tuaja.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster