Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Swali la kawaida ambalo msanidi anauliza DBA yake au mmiliki wa biashara anauliza mshauri wa PostgreSQL karibu kila wakati ni sawa: "Kwa nini maswali huchukua muda mrefu kutekeleza kwenye hifadhidata?"

Seti ya sababu za jadi:

  • algorithm isiyofaa
    unapoamua KUJIUNGA NA CTE kadhaa kwenye 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 ya kujitolea 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 kuzuia ni vigumu kutosha kukamata na kuchambua, basi kwa kila kitu kingine tunahitaji tu mpango wa kuuliza, ambayo inaweza kupatikana kwa kutumia ELEZA opereta (Ni bora, bila shaka, KUELEZA mara moja (KUCHAMBUA, VIBUFA) ...) au moduli_ya_otomatiki.

Lakini, kama ilivyoonyeshwa katika hati hiyo hiyo,

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

Lakini unaweza kufanya bila hiyo ikiwa unatumia chombo sahihi!

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

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 kutoka mwanzo ni ngumu sana na haifai:

  • inaonyeshwa kwenye nodi jumla ya rasilimali ndogo
    Hiyo ni, kuelewa ni muda gani ilichukua kutekeleza nodi fulani, au ni data ngapi haswa usomaji huu kutoka kwa jedwali uliopatikana kutoka kwa diski, unahitaji kwa njia fulani kutoa moja kutoka kwa nyingine.
  • muda wa nodi unahitajika zidisha kwa vitanzi
    Ndio, kutoa sio operesheni ngumu zaidi kufanya "kichwani mwako" - baada ya yote, wakati wa utekelezaji unaonyeshwa kama wastani wa utekelezaji mmoja wa nodi, na kunaweza kuwa na mamia yao.
  • Kweli, haya yote kwa pamoja yanatuzuia kujibu swali kuu - kwa hivyo ni nani kiungo dhaifu zaidi?

Tulipojaribu kuelezea haya yote kwa mamia kadhaa ya watengenezaji wetu, tuligundua kuwa kutoka nje inaonekana kitu kama hiki:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Na hiyo inamaanisha tunahitaji…

Chombo

Ndani yake, tumejaribu kukusanya mitambo yote muhimu ambayo inatusaidia kuelewa, kulingana na mpango na ombi, "nani wa kulaumiwa na nini cha kufanya." Na, bila shaka, tumeshiriki baadhi ya uzoefu wetu na jumuiya.
Kutana na kufurahiya - eleza.tensor.ru

Kuonekana kwa mipango

Je, ni rahisi kuelewa mpango unapoonekana kama hii?

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 ndivyo ilivyo, kwa ufupi, wakati viashiria muhimu vinatenganishwa, ni wazi zaidi:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Lakini ikiwa mpango huo ni ngumu zaidi, msaada utakuja chati ya usambazaji wa wakati kwa nodi:

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumze

Kweli, kwa chaguzi ngumu zaidi, anakimbilia kuwaokoa mchoro wa utekelezaji:

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

Viashiria vya kimuundo

Naam, ikiwa muundo mzima wa mpango na pointi zake dhaifu tayari zimewekwa na kuonekana, kwa nini usiwaangazie kwa msanidi programu na uwaeleze kwa Kiingereza wazi?

Nini ELEZA ni kimya kuhusu na jinsi ya kuifanya izungumzeTayari tumekusanya dazeni kadhaa za violezo hivi vya mapendekezo.

Wasifu wa swala la safu kwa safu

Sasa, ukiweka juu hoja asilia kwenye mpango unaochanganuliwa, unaweza kuona ni muda gani uliotumika kwa kila opereta mahususi—jambo kama hili:

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 hoja

Ikiwa haujaambatisha swali tu bali pia vigezo vyake kutoka kwa mstari wa DETAIL wa logi hadi kwenye mpango, unaweza kuinakili kwa kuongeza kwa kutumia mojawapo ya chaguo zifuatazo:

  • kwa uingizwaji wa maadili kwenye hoja
    kwa utekelezaji wa moja kwa moja kwa msingi wake na uwekaji wasifu zaidi
    SELECT 'const', 'param'::text;
  • na uingizwaji wa maadili 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, na ushiriki na wenzako! Mipango yako 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 changamoto na masuluhisho yanayotokea wakati wa kuchambua mpango.

Chanzo: mapenzi.com

Kuongeza maoni