Il-mistoqsija klassika li żviluppatur iġib lid-DBA tiegħu jew sid in-negozju jġib lil konsulent PostgreSQL kważi dejjem tinstema l-istess: "Għaliex it-talbiet jieħdu daqshekk żmien biex jitlestew fid-database?"
Sett tradizzjonali ta' raġunijiet:
- algoritmu ineffiċjenti
meta tiddeċiedi li tingħaqad ma' diversi CTEs fuq ftit għexieren ta' eluf ta' rekords - statistika skaduta
jekk id-distribuzzjoni attwali tad-dejta fit-tabella hija diġà differenti ħafna minn dik miġbura minn ANALYZE l-aħħar darba - "plagg" fuq ir-riżorsi
u m'għadx hemm biżżejjed qawwa tal-kompjuter dedikata tas-CPU, gigabytes tal-memorja qed jiġu ppumpjati kontinwament, jew id-diska ma tistax tlaħħaq mal-"xewqat" kollha tad-database - imblukkar minn proċessi li jikkompetu
U jekk l-imblukkar huma pjuttost diffiċli biex jaqbdu u janalizzaw, allura għal kull ħaġa oħra li għandna bżonn pjan ta' mistoqsija, li jistgħu jinkisbu bl-użu (Huwa aħjar, ovvjament, li immedjatament JISPJEGAW (ANALIZA, BUFFERS) ...) jew .
Iżda, kif intqal fl-istess dokumentazzjoni,
"Li nifhmu pjan hija arti, u biex tikkontrollaha teħtieġ ċertu ammont ta' esperjenza..."
Imma tista 'tagħmel mingħajrha jekk tuża l-għodda t-tajba!
Xi tipikament jidher pjan ta' mistoqsija? Xi haga hekk:
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=1jew bħal dan:
"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"Iżda l-qari tal-pjan fit-test "mill-folja" huwa diffiċli ħafna u mhux ċar:
- huwa muri fin-node somma mir-riżorsi tas-subtree
jiġifieri, biex tifhem kemm ħadet ħin biex tesegwixxi node partikolari, jew kemm eżattament dan il-qari mit-tabella ġab id-dejta mid-diska, trid b'xi mod tnaqqas waħda mill-oħra - ħin tan-node huwa meħtieġ immoltiplika b'linji
iva, it-tnaqqis mhuwiex l-aktar operazzjoni kumplessa li trid issir "fir-ras" - wara kollox, il-ħin ta 'eżekuzzjoni huwa indikat bħala l-medja għal eżekuzzjoni waħda ta' nodu, u jista 'jkun hemm mijiet minnhom - sew, u dan kollu flimkien ma jħalliniex inwieġbu l-mistoqsija ewlenija - allura min "l-iktar ħolqa dgħajfa"?
Meta ppruvajna nispjegaw dan kollu lil diversi mijiet mill-iżviluppaturi tagħna, indunajna li minn barra deher xi ħaġa bħal din:

U dan ifisser li għandna bżonn...
Tool
Fiha ppruvajna niġbru l-mekkaniżmi ewlenin kollha li jgħinu biex nifhmu "min għandu t-tort u x'għandu jagħmel" skont il-pjan u t-talba. Tajjeb, u aqsam parti mill-esperjenza tiegħek mal-komunità.
Iltaqa' u uża -
Viżibilità tal-pjanijiet
Huwa faċli li tifhem il-pjan meta jidher bħal dan?
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
Mhux tassew.
Imma bħal dan, f'forma mqassrameta l-indikaturi ewlenin huma separati, huwa ħafna aktar ċar:

Imma jekk il-pjan ikun aktar ikkumplikat, hu se jiġi għall-salvataġġ distribuzzjoni tal-ħin tal-piechart minn nodi:

Ukoll, għall-għażliet l-aktar diffiċli huwa mgħaġġla biex jgħin chart tal-progress:

Pereżempju, hemm sitwazzjonijiet pjuttost mhux trivjali meta pjan jista' jkollu aktar minn għerq attwali wieħed:


Ħjiel strutturali
Ukoll, jekk l-istruttura kollha tal-pjan u t-tikek fil-griżmejn tagħha diġà huma mqassma u viżibbli, għaliex ma tenfasizzahomx lill-iżviluppatur u tispjegahom bil-"lingwa Russa"?
Diġà ġbarna ftit tużżana mudelli ta' rakkomandazzjoni bħal dawn.
Profiler mistoqsija linja b'linja
Issa, jekk tissuperponi l-mistoqsija oriġinali fuq il-pjan analizzat, tista 'tara kemm inqatta' ħin fuq kull dikjarazzjoni individwali - xi ħaġa bħal din:

...jew anke hekk:

Sostituzzjoni ta' parametri f'talba
Jekk "mehmuż" mhux biss talba mal-pjan, iżda wkoll il-parametri tagħha mil-linja DETTALJAR tar-reġistru, tista' wkoll tikkopjaha f'waħda mill-għażliet:
- b'sostituzzjoni ta' valur fit-talba
għall-eżekuzzjoni diretta fuq il-bażi tiegħek u profili ulterjuriSELECT 'const', 'param'::text; - b'sostituzzjoni ta' valur permezz ta' PREPARE/EXECUTE
biex jimitaw ix-xogħol ta 'l-iskedar, meta l-parti parametrika tista' tiġi injorata - per eżempju, meta taħdem fuq tabelli diviżorjiDEALLOCATE ALL; PREPARE q(text) AS SELECT 'const', $1::text; EXECUTE q('param'::text);
Arkivju tal-pjanti
Paste, analizza, aqsam mal-kollegi! Il-pjanijiet se jibqgħu arkivjati u tista' terġa' lura għalihom aktar tard:
Imma jekk ma tridx li oħrajn jaraw il-pjan tiegħek, tinsiex tiċċekkja l-kaxxa "ma tippubblikax fl-arkivju".
Fl-artikoli li ġejjin se nitkellem dwar id-diffikultajiet u d-deċiżjonijiet li jinqalgħu meta janalizza pjan.
Sors: www.habr.com
