Klasikaline kĂŒsimus, millega arendaja pöördub oma DBA vĂ”i Ă€riomaniku poole â PostgreSQL konsultandi juurde â kĂ”lab peaaegu alati ĂŒhtemoodi: âMiks pĂ€ringud andmebaasis nii kaua kestavad?â
Traditsiooniline pÔhjuste komplekt:
- ebaefektiivne algoritm
kui otsustasite teha JOIN mitme CTE jĂ€rgi paari kĂŒmne tuhande kirje kaupa - aktuaalne statistika
kui tegelik andmete jaotus tabelis erineb juba oluliselt sellest, mis viimane ANALYZE'iga kogutud - "ressursside ummistus"
ja arvutusvĂ”imsus CPU-lt on nĂŒĂŒd liiga madal, igasugustes mĂ€lukeeristes on liiga palju andmeid vĂ”i kĂ”vaketas ei suuda andmebaasi kĂ”iki âsooveâ jĂ€rgida - lukud konkurenteest protsessidest
Ja kui lukustusi on keeruline tabada ja analĂŒĂŒsida, siis kĂ”ik muu osas piisab meile pĂ€ringu plaanist, mille saab kĂ€tte (muidugi on parem kohe EXPLAIN (ANALYZE, BUFFERS) ...) vĂ”i .
Kuid nagu öeldud samas dokumentatsioonis,
âPĂ€ringu plaani mĂ”istmine on kunst, ja selleks, et sellega hakkama saada, on vajalik kindel kogemus, ...â
Kuid saab hakkama ka ilma selleta, kui kasutada sobivat tööriista!
Kuidas nÀeb pÀringu plaan tavaliselt vÀlja? Umbes nii:
Indeksi skanni kasutamine pg_class_relname_nsp_index'il pg_class (reaegaalne aeg=0.049..0.050 read=1 tsĂŒklid=1)
Indeksi tingimus: (relname = $1)
Filter: (oid = $0)
MĂ€lu: jagatud hit=4
Algplaan 1 (tagastab $0,$1)
-> Piirang (reaegaalne aeg=0.019..0.020 read=1 tsĂŒklid=1)
MĂ€lu: jagatud hit=1
-> Sekv Scan pg_class pg_class_1 (reaegaalne aeg=0.015..0.015 read=1 tsĂŒklid=1)
Filter: (relkind = 'r'::"char")
Filteri kaudu eemaldatud read: 5
MÀlu: jagatud hit=1vÔi siis nii:
"Append (kulu=868.60..878.95 read=2 laius=233) (reaegaalne aeg=0.024..0.144 read=2 tsĂŒklid=1)"
" MĂ€lu: jagatud hit=3"
" CTE cl"
" -> Sekv Scan pg_class (kulu=0.00..868.60 read=9972 laius=537) (reaegaalne aeg=0.016..0.042 read=101 tsĂŒklid=1)"
" MĂ€lu: jagatud hit=3"
" -> Piirang (kulu=0.00..0.10 read=1 laius=233) (reaegaalne aeg=0.023..0.024 read=1 tsĂŒklid=1)"
" MĂ€lu: jagatud hit=1"
" -> CTE skannimine cl (kulu=0.00..997.20 read=9972 laius=233) (reaegaalne aeg=0.021..0.021 read=1 tsĂŒklid=1)"
" MĂ€lu: jagatud hit=1"
" -> Piirang (kulu=10.00..10.10 read=1 laius=233) (reaegaalne aeg=0.117..0.118 read=1 tsĂŒklid=1)"
" MĂ€lu: jagatud hit=2"
" -> CTE skannimine cl cl_1 (kulu=0.00..997.20 read=9972 laius=233) (reaegaalne aeg=0.001..0.104 read=101 tsĂŒklid=1)"
" MĂ€lu: jagatud hit=2"
"Planeerimise aeg: 0.634 ms"
"TĂ€itmise aeg: 0.248 ms"Aga plaani lugemine otse âleheltâ on vĂ€ga keeruline ja mitteĂŒtlev:
- sisse sÔlmes kuvatakse ressursside summa alampuu
ehk et mĂ”ista, kui kaua kulus aega konkreetse sĂ”lme tĂ€itmiseks, vĂ”i kui palju andmeid see lugemine tabelist tĂ”i kettalt â peab kuidagi ĂŒhest teiseni lahutama - sĂ”lme aeg tuleb korrutada tsĂŒklitega
Jah, lahkumine pole veel kĂ”ige keerulisem tehe, mida on vaja âmĂ”ttesâ teha â sest töötlemise aeg on keskmiselt nĂ€idatud ĂŒhe sĂ”lme tĂ€itmise jaoks, ja neid vĂ”ib olla sadu. - Noh, ja kĂ”ik see kokku takistab vastata peamisele kĂŒsimusele â nii kes siis on. âkĂ”ige nĂ”rgem lĂŒliâ?
Kui me pĂŒĂŒdsime seda selgitada mitmesajale meie arendajale, siis mĂ”istsime, et sealtpoolt nĂ€eb see vĂ€lja umbes nii:

Seega, meil on vaja...
Tööriist
Oleme pĂŒĂŒdnud kokku koguda kĂ”ik peamised mehhanismid, mis aitavad plaani ja pĂ€ringu mĂ”istmisel, âkes on sĂŒĂŒdi ja mida tehaâ. Noh, ja jagada osa oma kogemusest kogukonnaga.
Tere tulemast ja kasutage â
Plaanide selgus
Kas plaani arusaamine on lihtne, kui see vÀlja nÀeb nii?
Seq Scan pg_class peal (reaalne aeg=0.009..1.304 read=6609 tsĂŒklis=1) Buffers: jagatud hit=263 Planeerimise aeg: 0.108 ms TĂ€itmise aeg: 1.800 ms
Ei, justkui ei.
Aga nii, kokkuvĂ”tlikult, kui peamised nĂ€itajad on eraldi â on juba palju arusaadavam:

Aga kui plaan on keerulisem â tuleb appi piechart ajajaotuse sĂ”lmedes:

Noh, ja kÔige keerulisemate variantide puhul aitab tÀitmisdiagramm:

NĂ€iteks esinevad piisavalt ebatavalised olukorrad, kui plaanil vĂ”ib olla rohkem kui ĂŒks tegelik juur:


Struktuursed nÀpunÀited
Noh, ja kui kogu plaani struktuur ja selle nĂ”rgad kohad on juba vĂ€lja pakitud ja nĂ€htavad â miks mitte tĂ”sta need arendajale esile ja seletada "lihtsas keeles"?
Oleme juba kogunud selliseid soovituste malli paar tosinat.
Ridade profiilimise pÀring
NĂŒĂŒd, kui analĂŒĂŒsitavale plaanile on kohandatud algne pĂ€ring, siis saab nĂ€ha, kui palju aega kulus iga eraldi operaatori jaoks â umbes nii:

⊠vÔi isegi nii:

Parameetrite asendamine pÀringus
Kui oled âkinni pannudâ plaani mitte ainult pĂ€ringu, vaid ka selle parameetritega DETAIL-reas logis, siis saad sellekoopida tĂ€iendavalt ĂŒhes variandis:
- parameetrite asemele pÀringus
otseseks tÀitmiseks oma andmebaasis ja edasise profiilimise jaoksSELECT 'const', 'param'::text; - parameetrite asemele koos PREPARE/EXECUTE
planeerija töö simuleerimiseks, kui parameetriline osa vĂ”ib jÀÀda tĂ€helepanuta â nĂ€iteks sektsioonitud tabelite puhulDEALLOCATE ALL; PREPARE q(text) AS SELECT 'const', $1::text; EXECUTE q('param'::text);
Planimine arhiv
Sisestage, analĂŒĂŒsige, jagage kolleegidega! Plaanid jÀÀvad arhiivi ja saate neile hiljem tagasi pöörduda:
Kuid kui te ei soovi, et teie plaani teised nĂ€eksid, Ă€rge unustage linnukest âĂ€ra avalikusta arhiivisâ mĂ€rkida.
JĂ€rgnevates artiklites rÀÀgin neist keerukatest teenustest ja lahendustest, mis tekivad plaani analĂŒĂŒsimisel.
Allikas: habr.com
