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 (Ni bora, bila shaka, KUELEZA mara moja (KUCHAMBUA, VIBUFA) ...) au .
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=1au 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:

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

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

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

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


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?
Tayari 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:

... au hata kama hii:

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 zaidiSELECT '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:
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
