Millest EXPLAIN vaikib ja kuidas seda vestlema Àratada

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 EXPLAIN lause abil (muidugi on parem kohe EXPLAIN (ANALYZE, BUFFERS) ...) vĂ”i auto_explain moodulist.

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=1

vÔ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:

Millest EXPLAIN vaikib ja kuidas seda vestlema Àratada

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 — explain.tensor.ru

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:

Millest EXPLAIN vaikib ja kuidas seda vestlema Àratada

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

Millest EXPLAIN vaikib ja kuidas seda vestlema Àratada

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

Millest EXPLAIN vaikib ja kuidas seda vestlema Àratada

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

Millest EXPLAIN vaikib ja kuidas seda vestlema ÀratadaMillest EXPLAIN vaikib ja kuidas seda vestlema Àratada

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"?

Millest EXPLAIN vaikib ja kuidas seda vestlema ÀratadaOleme 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:

Millest EXPLAIN vaikib ja kuidas seda vestlema Àratada


 vÔi isegi nii:

Millest EXPLAIN vaikib ja kuidas seda vestlema Àratada

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 jaoks
    SELECT 'const', 'param'::text;
  • parameetrite asemele koos PREPARE/EXECUTE
    planeerija töö simuleerimiseks, kui parameetriline osa vĂ”ib jÀÀda tĂ€helepanuta — nĂ€iteks sektsioonitud tabelite puhul
    DEALLOCATE 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: explain.tensor.ru/archive

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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster