Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

Ang klasiko nga pangutana nga gidala sa usa ka developer sa iyang DBA o usa ka tag-iya sa negosyo nga gidala sa usa ka consultant sa PostgreSQL hapit kanunay parehas nga tunog: "Ngano nga ang mga hangyo dugay nga makompleto sa database?"

Tradisyonal nga hugpong sa mga hinungdan:

  • dili maayo nga algorithm
    sa diha nga ikaw modesisyon sa pag-apil sa pipila ka mga CTE sa usa ka magtiayon nga sa napulo ka libo nga mga rekord
  • walay kalabotan nga estadistika
    kung ang aktuwal nga pag-apod-apod sa datos sa lamesa lahi na kaayo sa nakolekta sa ANALYZE sa miaging higayon
  • "plug" sa mga kapanguhaan
    ug wala nay igo nga gipahinungod nga gahum sa pag-compute sa CPU, ang gigabytes nga memorya kanunay nga gibomba, o ang disk dili makasunod sa tanan nga "gusto" sa database
  • pagbabag gikan sa kompetisyon nga mga proseso

Ug kung ang mga pag-block lisud nga makuha ug analisahon, nan alang sa tanan nga kinahanglan namon plano sa pangutana, nga makuha gamit ang PASABOT operator (Mas maayo, siyempre, nga ipatin-aw dayon (ANALYZE, BUFFERS) ...) o auto_explain module.

Apan, ingon sa gipahayag sa parehas nga dokumentasyon,

"Ang pagsabut sa usa ka plano usa ka arte, ug ang pag-master niini nanginahanglan usa ka piho nga kantidad sa kasinatian ..."

Apan mahimo nimo nga wala kini kung mogamit ka sa husto nga himan!

Unsa ang kasagarang hitsura sa usa ka plano sa pangutana? Ingon niana:

Index Scan using pg_class_relname_nsp_index on pg_class (actual time=0.049..0.050 rows=1 loops=1)
  Index Cond: (relname = $1)
  Filter: (oid = $0)
  Buffers: shared hit=4
  InitPlan 1 (returns $0,$1)
    ->  Limit (actual time=0.019..0.020 rows=1 loops=1)
          Buffers: shared hit=1
          ->  Seq Scan on pg_class pg_class_1 (actual time=0.015..0.015 rows=1 loops=1)
                Filter: (relkind = 'r'::"char")
                Rows Removed by Filter: 5
                Buffers: shared hit=1

o sama niini:

"Append  (cost=868.60..878.95 rows=2 width=233) (actual time=0.024..0.144 rows=2 loops=1)"
"  Buffers: shared hit=3"
"  CTE cl"
"    ->  Seq Scan on pg_class  (cost=0.00..868.60 rows=9972 width=537) (actual time=0.016..0.042 rows=101 loops=1)"
"          Buffers: shared hit=3"
"  ->  Limit  (cost=0.00..0.10 rows=1 width=233) (actual time=0.023..0.024 rows=1 loops=1)"
"        Buffers: shared hit=1"
"        ->  CTE Scan on cl  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.021..0.021 rows=1 loops=1)"
"              Buffers: shared hit=1"
"  ->  Limit  (cost=10.00..10.10 rows=1 width=233) (actual time=0.117..0.118 rows=1 loops=1)"
"        Buffers: shared hit=2"
"        ->  CTE Scan on cl cl_1  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.001..0.104 rows=101 loops=1)"
"              Buffers: shared hit=2"
"Planning Time: 0.634 ms"
"Execution Time: 0.248 ms"

Apan ang pagbasa sa plano sa teksto "gikan sa panid" lisud kaayo ug dili klaro:

  • gipakita sa node sum pinaagi sa subtree resources
    kana mao, aron masabtan kung pila ka oras ang gikinahanglan aron ipatuman ang usa ka partikular nga node, o kung unsa ka eksakto nga kini nga pagbasa gikan sa lamesa nagdala sa datos gikan sa disk, kinahanglan nimo nga ibawas ang usa gikan sa lain.
  • gikinahanglan ang oras sa node multiply pinaagi sa mga galong
    oo, ang pagkubkob dili ang labing komplikado nga operasyon nga kinahanglan buhaton "sa ulo" - pagkahuman, ang oras sa pagpatay gipakita ingon ang kasagaran alang sa usa ka pagpatay sa usa ka node, ug mahimo’g adunay gatusan niini.
  • maayo, ug kining tanan nga magkauban nagpugong kanato sa pagtubag sa panguna nga pangutana - busa kinsa "ang pinakahuyang nga link"?

Kung gisulayan namon nga ipasabut kining tanan sa daghang gatos sa among mga developer, nahibal-an namon nga gikan sa gawas kini ingon niini:

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

Ug kana nagpasabut nga kinahanglan naton ...

Galamiton

Niini gisulayan namon nga kolektahon ang tanan nga yawe nga mga mekaniko nga makatabang sa pagsabut "kinsa ang mabasol ug kung unsa ang buhaton" sumala sa plano ug hangyo. Aw, ug ipaambit ang bahin sa imong kasinatian sa komunidad.
Himamata ug gamiton - explain.tensor.ru

Pagkakita sa mga plano

Sayon ra ba sabton ang plano kung ingon niini?

Seq Scan on pg_class (actual time=0.009..1.304 rows=6609 loops=1)
  Buffers: shared hit=263
Planning Time: 0.108 ms
Execution Time: 1.800 ms

Dili gyud.

Apan ingon niini, sa pinamubo nga pormakung ang mga yawe nga mga timailhan gibulag, kini labi ka klaro:

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

Apan kon mas komplikado ang plano, motabang siya pag-apod-apod sa oras sa piechart pinaagi sa mga node:

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

Aw, alang sa labing lisud nga mga kapilian siya nagdali sa pagtabang tsart sa pag-uswag:

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

Pananglitan, adunay mga dili importante nga mga sitwasyon kung ang usa ka plano mahimong adunay labaw pa sa usa ka tinuod nga gamut:

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsultiUnsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ подсказки

Aw, kung ang tibuuk nga istruktura sa plano ug ang mga sakit nga mga lugar niini nabutang na ug makita, nganong dili i-highlight kini sa developer ug ipasabut kini sa "Russian nga pinulongan"?

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsultiNakolekta na namo ang duha ka dosena nga mga template sa rekomendasyon.

Line-by-line query profiler

Karon, kung imong ibutang ang orihinal nga pangutana sa gi-analisa nga plano, imong makita kung pila ka oras ang gigugol sa matag indibidwal nga pahayag - sama niini:

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

...o bisan ingon niini:

Unsa ang hilom mahitungod sa EXPLAIN ug kung unsaon kini pagsulti

Pag-ilis sa mga parameter sa usa ka hangyo

Kung imong "gilakip" dili lamang ang usa ka hangyo sa plano, apan usab ang mga parameter niini gikan sa linya sa DETAIL sa log, mahimo nimong kopyahon kini sa usa sa mga kapilian:

  • nga adunay pagpuli sa bili sa hangyo
    alang sa direkta nga pagpatuman sa imong base ug dugang nga pag-profile

    SELECT 'const', 'param'::text;
  • nga adunay pag-ilis sa kantidad pinaagi sa PAG-ANDAM/PAGPATUMAN
    sa pagsundog sa buhat sa scheduler, sa diha nga ang parametric nga bahin mahimong ibaliwala - pananglitan, sa diha nga nagtrabaho sa partitioned lamesa

    DEALLOCATE ALL;
    PREPARE q(text) AS SELECT 'const', $1::text;
    EXECUTE q('param'::text);
    

Archive sa mga plano

Idikit, analisa, ipaambit sa mga kauban! Ang mga plano magpabilin nga naka-archive ug mahimo nimong ibalik kini sa ulahi: explain.tensor.ru/archive

Apan kung dili nimo gusto nga makita sa uban ang imong plano, ayaw kalimti nga susihon ang kahon nga "ayaw imantala sa archive".

Sa sunod nga mga artikulo maghisgot ako bahin sa mga kalisdanan ug mga desisyon nga motumaw sa pag-analisar sa usa ka plano.

Source: www.habr.com

Idugang sa usa ka comment