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
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:
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 -
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:
Apan kon mas komplikado ang plano, motabang siya pag-apod-apod sa oras sa piechart pinaagi sa mga node:
Aw, alang sa labing lisud nga mga kapilian siya nagdali sa pagtabang tsart sa pag-uswag:
Pananglitan, adunay mga dili importante nga mga sitwasyon kung ang usa ka plano mahimong adunay labaw pa sa usa ka tinuod nga gamut:
Π‘ΡΡΡΠΊΡΡΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ
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"?
Nakolekta 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:
...o bisan ingon niini:
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-profileSELECT '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 lamesaDEALLOCATE 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:
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