Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Swali la kawaida ambalo msanidi huleta kwa DBA yake au mmiliki wa biashara huleta kwa mshauri wa PostgreSQL karibu kila wakati linasikika sawa: "Kwa nini maombi huchukua muda mrefu kukamilika kwenye hifadhidata?"

Seti ya sababu za jadi:

  • algorithm isiyofaa
    unapoamua KUJIUNGA NA CTE kadhaa juu ya makumi kadhaa ya maelfu ya rekodi
  • takwimu zisizo na maana
    ikiwa usambazaji halisi wa data kwenye jedwali tayari ni tofauti sana na ule uliokusanywa na ANALYZE mara ya mwisho
  • "plug" kwenye rasilimali
    na hakuna tena nguvu ya kutosha ya kompyuta iliyojitolea ya CPU, gigabytes za kumbukumbu zinasukumwa kila mara, au diski haiwezi kuendana na "mahitaji" yote ya hifadhidata.
  • kuzuia kutoka kwa michakato ya ushindani

Na ikiwa vizuizi ni ngumu sana kukamata na kuchambua, basi kwa kila kitu kingine tunachohitaji mpango wa kuuliza, ambayo inaweza kupatikana kwa kutumia ELEZA opereta (Ni bora, kwa kweli, KUELEZA mara moja (KUCHAMBUA, BUFFERS) ...) au moduli_ya_otomatiki.

Lakini, kama ilivyoonyeshwa katika hati hiyo hiyo,

"Kuelewa mpango ni sanaa, na ili kuujua kunahitaji uzoefu fulani..."

Lakini unaweza kufanya bila hiyo ikiwa unatumia chombo sahihi!

Je, mpango wa kuuliza unaonekanaje kwa kawaida? Kitu kama hicho:

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

au kama hii:

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

Lakini kusoma mpango huo kwa maandishi "kutoka kwa karatasi" ni ngumu sana na haijulikani wazi:

  • inaonyeshwa kwenye nodi jumla kwa rasilimali ndogo
    yaani, kuelewa ni muda gani ilichukua kutekeleza nodi fulani, au ni kiasi gani hasa usomaji huu kutoka kwa jedwali ulileta data kutoka kwa diski, unahitaji kwa namna fulani kutoa moja kutoka kwa nyingine.
  • muda wa nodi unahitajika zidisha kwa vitanzi
    ndio, kutoa sio operesheni ngumu zaidi ambayo inahitaji kufanywa "kichwani" - baada ya yote, wakati wa utekelezaji unaonyeshwa kama wastani wa utekelezaji mmoja wa nodi, na kunaweza kuwa na mamia yao.
  • vizuri, na haya yote kwa pamoja yanatuzuia kujibu swali kuu - hivyo nani "kiungo dhaifu zaidi"?

Tulipojaribu kuelezea haya yote kwa mamia kadhaa ya watengenezaji wetu, tuligundua kuwa kutoka nje ilionekana kama hii:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Na hiyo inamaanisha tunahitaji ...

Chombo

Ndani yake tulijaribu kukusanya mechanics yote muhimu ambayo husaidia kuelewa "nani wa kulaumiwa na nini cha kufanya" kulingana na mpango na ombi. Naam, na ushiriki sehemu ya uzoefu wako na jumuiya.
Kutana na kutumia - eleza.tensor.ru

Kuonekana kwa mipango

Je, ni rahisi kuelewa mpango unapoonekana hivi?

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

Sio kweli.

Lakini kama hivi, kwa ufupiwakati viashiria muhimu vinatenganishwa, ni wazi zaidi:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Lakini ikiwa mpango huo ni ngumu zaidi, atakuja kuwaokoa usambazaji wa wakati wa chati kwa nodi:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Kweli, kwa chaguzi ngumu zaidi ana haraka kusaidia chati ya maendeleo:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Kwa mfano, kuna hali zisizo za kawaida wakati mpango unaweza kuwa na mizizi zaidi ya moja:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumzeNini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Vidokezo vya kimuundo

Kweli, ikiwa muundo mzima wa mpango na matangazo yake ya kidonda tayari yamewekwa na yanaonekana, kwa nini usiwaangazie msanidi programu na uwaeleze kwa "lugha ya Kirusi"?

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumzeTayari tumekusanya violezo kadhaa vya mapendekezo kama haya.

Wasifu wa swali la mstari kwa mstari

Sasa, ikiwa utaweka hoja asilia kwenye mpango uliochanganuliwa, unaweza kuona ni muda gani uliotumika kwa kila taarifa ya mtu binafsi - kitu kama hiki:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

... au hata kama hii:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Kubadilisha vigezo kwenye ombi

Ikiwa "umeambatisha" sio ombi tu kwa mpango, lakini pia vigezo vyake kutoka kwa safu ya DETAIL ya logi, unaweza kuiiga kwa kuongeza katika moja ya chaguzi:

  • kwa kubadilisha thamani katika hoja
    kwa utekelezaji wa moja kwa moja kwenye msingi wako na wasifu zaidi

    SELECT 'const', 'param'::text;
  • kwa kubadilisha thamani kupitia PREPARE/EXECUTE
    kuiga kazi ya mpangaji, wakati sehemu ya parametric inaweza kupuuzwa - kwa mfano, wakati wa kufanya kazi kwenye meza zilizogawanywa.

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

Hifadhi ya mipango

Bandika, chambua, shiriki na wenzako! Mipango itasalia kwenye kumbukumbu na unaweza kurudi kwao baadaye: eleza.tensor.ru/archive

Lakini ikiwa hutaki wengine waone mpango wako, usisahau kuteua kisanduku cha "usichapishe kwenye kumbukumbu".

Katika makala zifuatazo nitazungumzia matatizo na maamuzi yanayotokea wakati wa kuchambua mpango.

Chanzo: mapenzi.com

Kuongeza maoni