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

Gjasht muaj mĂ« parĂ« ne prezantuam explain.tensor.ru — publik shĂ«rbim pĂ«r analizimin dhe vizualizimin e planeve tĂ« kĂ«rkesave nĂ« PostgreSQL.

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

GjatĂ« kĂ«tyre muajve ne bĂ«mĂ« njĂ« raport pĂ«r tĂ« nĂ« PGConf.Russia 2020, pĂ«rgatitĂ«m njĂ« artikull pĂ«r pĂ«rshpejtimin e SQL-kĂ«rkesave nĂ« bazĂ« tĂ« rekomandimeve qĂ« ai jep
 por mĂ« e rĂ«ndĂ«sishmja — mbledhĂ«m komentet tuaja dhe shqyrtuam rastet reale tĂ« pĂ«rdorimit. Dhe tani jemi gati 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ë gjithë bllokun, duke filluar nga rreshti me

Query Text , me të gjitha hapësirat që parashohen: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)

        Teksti i Kërkesës: INSERT INTO  dicquery_20200604  VALUES ($1.*) ON CONFLICT (query) DO NOTHING; Insert në dicquery_20200604  (cost=0.00..0.05 rows=1 width=52) (koha reale=40.376..40.376 rows=0 loops=1) Konflikti i Zgjidhjes: NISHTA Indexet e Arbitrazhit të Konfliktit: dicquery_20200604_pkey Tuples e Shtuar: 1 Tuples Konfliktuese: 0 Buffers: hit të ndarë=9 lexuar=1 ndotur=1 ->  Rezultati  (cost=0.00..0.05 rows=1 width=52) (koha reale=0.001..0.001 rows=1 loops=1)


 dhe e hedhim të gjithë të kopjuar në fushën për planin, pa e ndarë asgjë:

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

Në daljen marrim si një bonus për planin e analizuar gjithashtu tavolinën "kontekst", ku kërkesa jonë paraqitet në gjithë shkëlqimin e saj:

E kuptojmë planet e kërkesave PostgreSQL edhe 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
  }
]"

Sado me thonj tĂ« jashtĂ«m, siç kopjon pgAdmin, ose pa — e hedhim nĂ« tĂ« njĂ«jtĂ«n fushĂ«, nĂ« dalje — bukuri:

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

Vizualizim i zgjeruar

Koha e Planifikimit / Koha e Ekzekutimit

Tani shihet më qartë se ku ka shkuar koha shtesë gjatë ekzekutimit të kërkesës:

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

Koha I/O

Ndonjëherë përballemi me situata ku në plan duket se resurset janë lexuar-shkruar jo shumë, por koha e ekzekutimit duket disi jashtëzakonisht e madhe.

KĂ«tu ndonjeherĂ« duhet tĂ« themi: "O e dashur, ndoshta nĂ« atĂ« moment disku nĂ« server ishte shumĂ« i ngarkuar, pĂ«r kĂ«tĂ« arsye leximi ishte kaq i gjatĂ«!" Por ndoshta nuk Ă«shtĂ« aq e saktë 

Por mund ta përcaktojmë me saktësi të plotë. Pika është se midis opsioneve të konfigurimit të serverit PG, është track_io_timing:

Aktivizon matjen e kohës së operacioneve të hyrje/daljes. Ky parametr në përputhje me rregullat është i çaktivizuar, pasi për këtë kërkohet të kërkoni vazhdimisht kohën aktuale nga sistemi operativ, e cila mund të ngadalësojë ndjeshëm punën në disa platforma. Për të vlerësuar humbjet e matjes së kohës në platformën tuaj, mund të përdorni utilitarin pg_test_timing. Statistikën e hyrje/daljes mund ta merrni përmes përfaqësimit pg_stat_database, në daljen EXPLAIN (kur përdoret parametri BUFFERS) dhe përmes përfaqësimit pg_stat_statements.

Ky parametr mund të aktivizohet edhe brenda një sesioni lokal:

SET track_io_timing = TRUE;

Po, tani gjëja më e këndshme është se kemi mësuar të kuptojmë dhe të paraqesim këta të dhëna duke marrë parasysh të gjitha transformimet e pemës së ekzekutimit:

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

KĂ«tu mund tĂ« vĂ«reni se nga 0.790ms e gjithĂ« kohĂ«s sĂ« ekzekutimit, 0.718ms kishte shkuar pĂ«r tĂ« lexuar njĂ« faqe tĂ« dhĂ«nash, 0.044ms — pĂ«r ta shkruar atĂ«, dhe pĂ«r tĂ« gjitha aktivitetet e tjera tĂ« dobishme ishte shpenzuar vetĂ«m 0.028ms!

E ardhmja me PostgreSQL 13

Për të lexuar një përmbledhje të plotë të noviteteve, mund të vizitoni në një artikull të detajuar, dhe ne konkretisht flasim për ndryshimet në plane.

Bashkëpunimi i burimeve të planifikimit

Konsiderimi i burimeve të rezervuara nga planifikuesi u reflektua gjithashtu 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 në fazën e planifikimit:

 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

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

Krijimi inkremental

NĂ« rastet kur kĂ«rkohet renditje sipas shumĂ« çelĂ«save (k1, k2, k3
), planifikuesi tani mund tĂ« shfrytĂ«zojĂ« njohjen se tĂ« dhĂ«nat janĂ« renditur tashmĂ« sipas disa nga çelĂ«sat e parĂ« (pĂ«r shembull, k1 dhe k2). NĂ« kĂ«tĂ« rast, nuk Ă«shtĂ« e nevojshme tĂ« riprendim tĂ« gjitha tĂ« dhĂ«nat, por mund tĂ« ndahet nĂ« grupe tĂ« radhitura me tĂ« njĂ«jtin vlerĂ« k1 dhe k2, dhe "tĂ« plotĂ«sohet" sipas çelĂ«sit k3.

Kështu të gjithë renditja shpërbëhet në disa renditje sekondare më të vogla. Kjo zvogëlon sasinë e memories së nevojshme, dhe gjithashtu lejon që të dhënat e para të jepen më herët, përpara se të përfundojë e gjithë renditja.

 Renditja inkrementale (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

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

Përmirësime UI/UX

Skrinët, ata janë kudo!

Tani tani çdo skedĂ« ka shfaqur mundĂ«sinĂ« pĂ«r tĂ« marrĂ« shpejt njĂ« screenshot tĂ« skedĂ«s nĂ« clipboard nĂ« tĂ« gjithĂ« gjerĂ«sinĂ« dhe thellĂ«sinĂ« e skedĂ«s — ‘shikimi’ nĂ« anĂ«n e djathtĂ«-lartĂ«:

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

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

Rekomandimet në nyje

Jo vetëm që janë bërë më shumë, por për secilën mund të lexoni në detaj në artikull, duke klikuar në lidhjen:

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

Fshirja nga arhiva

Disa kĂ«rkuan shumĂ« qĂ« tĂ« shtohej mundĂ«sia pĂ«r tĂ« fshirĂ« ‘plotĂ«sisht’ edhe planet qĂ« nuk publikohen nĂ« arhiv — ju lutem, mjafton tĂ« shtypni ikonĂ«n pĂ«rkatĂ«se:

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

Po ashtu, mos e haroni që kemi grupin e mbështetjes, ku mund të dërgoni vërejtjet dhe propozimet tuaja.

Burimi: habr.com

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