Ki sa ki EXPLAIN se an silans sou ak ki jan fè li pale

Kesyon klasik yon pwomotè pote nan DBA li, oswa yon pwopriyetè biznis pote bay yon konsiltan PostgreSQL, prèske toujou son menm jan an: "Poukisa demann yo pran anpil tan pou konplete sou baz done a?"

Ansanm tradisyonèl rezon:

  • algorithm ki pa efikas
    lè ou deside rantre nan plizyè CTE sou yon koup de dizèn de milye dosye
  • estatistik ki pa enpòtan
    si distribisyon aktyèl la nan done nan tablo a deja trè diferan de sa ki kolekte pa ANALYZE dènye fwa
  • "ploge" sou resous yo
    epi pa gen ase pouvwa informatique dedye CPU a, gigaocte memwa yo toujou ap ponpe, oswa disk la pa ka kenbe ak tout "vle" baz done a.
  • bloke soti nan pwosesis konpetisyon

Men, si bloke yo byen difisil trape ak analize, Lè sa a, pou tout lòt bagay nou bezwen plan demann, ki ka jwenn lè l sèvi avèk EXPLAIN operatè (Li pi bon, nan kou, imedyatman EXPLIZE (ANALIZE, TAMPON) ...) oswa modil auto_explain.

Men, jan sa endike nan menm dokiman an,

"Konprann yon plan se yon atizay, epi metrize li mande pou yon sèten kantite eksperyans ..."

Men, ou ka fè san li si ou sèvi ak bon zouti!

Ki jan yon plan rechèch anjeneral sanble? Yon bagay konsa:

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

oswa tankou sa a:

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

Men, lekti plan an nan tèks "nan fèy la" trè difisil ak klè:

  • parèt nan ne la sòm pa resous subtree
    se sa ki, pou konprann konbyen tan li te pran pou egzekite yon ne patikilye, oswa konbyen egzakteman lekti sa a soti nan tablo a te pote done ki soti nan disk la, ou bezwen yon jan kanmenm soustraksyon youn nan lòt la.
  • tan ne nesesè miltipliye pa bouk
    wi, soustraksyon se pa operasyon ki pi konplèks ki dwe fè "nan tèt la" - apre yo tout, tan an ekzekisyon endike kòm mwayèn pou yon sèl ekzekisyon nan yon ne, epi ka gen dè santèn de yo.
  • byen, ak tout bagay sa yo ansanm anpeche nou reponn kesyon prensipal la - se konsa ki moun "Lyen ki pi fèb la"?

Lè nou te eseye eksplike tout sa a plizyè santèn nan devlopè nou yo, nou reyalize ke soti nan deyò li te sanble yon bagay tankou sa a:

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li pale

E sa vle di nou bezwen...

Zouti

Nan li nou te eseye kolekte tout mekanik kle yo ki ede, dapre plan an ak demann, konprann "ki moun ki blame ak sa yo dwe fè." Oke, epi pataje yon pati nan eksperyans ou ak kominote a.
Rankontre ak itilize - eksplike.tensor.ru

Vizibilite plan yo

Èske li fasil pou konprann plan an lè li sanble sa a?

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

Pa reyèlman.

Men, tankou sa a, nan fòm abrejelè endikatè kle yo separe, li pi klè:

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li pale

Men, si plan an pi konplike, li pral vin sekou distribisyon tan graphique pa nœuds:

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li pale

Oke, pou opsyon ki pi difisil li se nan yon prese ede tablo pwogrè:

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li pale

Pou egzanp, gen sitiyasyon byen ki pa trivial lè yon plan ka gen plis pase yon rasin aktyèl:

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li paleKi sa ki EXPLAIN se an silans sou ak ki jan fè li pale

Endikasyon estriktirèl

Oke, si tout estrikti plan an ak tach ki fè mal li yo deja mete deyò epi yo vizib, poukisa yo pa mete aksan sou yo bay pwomotè a epi eksplike yo nan "lang Ris"?

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li paleNou te deja kolekte yon koup de douzèn modèl rekòmandasyon sa yo.

Profiler rechèch liy-pa-liy

Koulye a, si ou sipèpoze rechèch orijinal la sou plan analiz la, ou ka wè konbyen tan yo te pase sou chak deklarasyon endividyèl - yon bagay tankou sa a:

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li pale

...oswa menm jan sa a:

Ki sa ki EXPLAIN se an silans sou ak ki jan fè li pale

Ranplase paramèt nan yon demann

Si ou "tache" pa sèlman yon demann nan plan an, men tou paramèt li yo nan liy DETAIL nan boutèy la, ou ka anplis kopye li nan youn nan opsyon sa yo:

  • ak sibstitisyon valè nan rechèch la
    pou ekzekisyon dirèk sou baz ou ak plis profilage

    SELECT 'const', 'param'::text;
  • ak sibstitisyon valè atravè PREPARE/EXECUTE
    imite travay orè a, lè pati parametrik la ka inyore - pou egzanp, lè w ap travay sou tab patisyon yo

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

Achiv plan yo

Kole, analize, pataje ak kòlèg yo! Plan yo ap rete achiv epi ou ka retounen sou yo pita: eksplike.tensor.ru/archive

Men, si ou pa vle lòt moun wè plan ou a, pa bliye tcheke bwat "pa pibliye nan achiv".

Nan atik sa yo mwen pral pale sou difikilte ak desizyon ki rive lè analize yon plan.

Sous: www.habr.com

Add nouvo kòmantè