Tayari umeitumia zaidi ya mara 6000, lakini kipengele kimoja muhimu ambacho huenda hakijatambuliwa ni dalili za kimuundo, ambayo inaonekana kama hii:
Wasikilize, na maombi yako βyatakuwa laini na yenye hariri.β π
Lakini kwa umakini, hali nyingi ambazo hufanya ombi kuwa polepole na njaa ya rasilimali ni za kawaida na zinaweza kutambuliwa na muundo na data ya mpango.
Katika kesi hii, kila msanidi programu sio lazima atafute chaguo la uboreshaji peke yake, akitegemea tu uzoefu wake - tunaweza kumwambia kinachotokea hapa, sababu inaweza kuwa nini, na. jinsi ya kushughulikia suluhisho. Ndivyo tulivyofanya.
Hebu tuchunguze kwa undani kesi hizi - jinsi zinavyofafanuliwa na ni mapendekezo gani wanayoongoza.
Ili kuzama vizuri katika mada, unaweza kwanza kusikiliza kizuizi kinacholingana kutoka ripoti yangu katika PGConf.Russia 2020, na kisha tu kuendelea na uchambuzi wa kina wa kila mfano:
#1: index "undersorting"
Wakati gani
Onyesha ankara ya hivi karibuni ya mteja "LLC Kolokolchik".
Hata kwenye sampuli ya zamani kama hii - Mara 8.5 haraka na mara 33 kusoma kidogo. Kadiri unavyokuwa na "ukweli" zaidi kwa kila thamani, ndivyo athari inavyoonekana zaidi fk.
Ninagundua kuwa faharisi kama hiyo itafanya kazi kama faharisi ya "kiambishi awali" sio mbaya zaidi kuliko hapo awali kwa maswali mengine na fk, mahali pa kupanga pk haikuwepo na haipo (unaweza kusoma zaidi kuhusu hili katika makala yangu kuhusu kupata faharisi zisizofaa) Ikiwa ni pamoja na, itatoa kawaida usaidizi wa ufunguo wa kigeni wa wazi kwenye uwanja huu.
#2: makutano ya faharisi (BitmapAnd)
Wakati gani
Onyesha makubaliano yote kwa mteja "LLC Kolokolchik", iliyohitimishwa kwa niaba ya "NAO Buttercup".
Jinsi ya kutambua
-> BitmapAnd
-> Bitmap Index Scan
-> Bitmap Index Scan
Mapendekezo
kujenga index ya mchanganyiko kwa shamba kutoka kwa zote mbili asili au kupanua moja ya zilizopo na mashamba kutoka kwa pili.
Mfano:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, (random() * 100)::integer fk_org -- 100 ΡΠ°Π·Π½ΡΡ Π²Π½Π΅ΡΠ½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ
, (random() * 1000)::integer fk_cli; -- 1K ΡΠ°Π·Π½ΡΡ Π²Π½Π΅ΡΠ½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ
CREATE INDEX ON tbl(fk_org); -- ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ foreign key
CREATE INDEX ON tbl(fk_cli); -- ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ foreign key
SELECT
*
FROM
tbl
WHERE
(fk_org, fk_cli) = (1, 999); -- ΠΎΡΠ±ΠΎΡ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΠ°ΡΠ΅
(
SELECT
*
FROM
tbl
WHERE
fk_own = 1 -- ΡΠ½Π°ΡΠ°Π»Π° "ΡΠ²ΠΎΠΈ" 20
ORDER BY
pk
LIMIT 20
)
UNION ALL
(
SELECT
*
FROM
tbl
WHERE
fk_own IS NULL -- ΠΏΠΎΡΠΎΠΌ "Π½ΠΈΡΡΠΈ" 20
ORDER BY
pk
LIMIT 20
)
LIMIT 20; -- Π½ΠΎ Π²ΡΠ΅Π³ΠΎ - 20, Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π½Π΅ Π½Π°Π΄ΠΎ
Tulichukua fursa ya ukweli kwamba rekodi zote 20 zinazohitajika zilipokelewa mara moja kwenye block ya kwanza, kwa hivyo ya pili, na "ghali" zaidi ya Bitmap Heap Scan, haikutekelezwa - mwishowe. 22x kasi, 44x chini ya kusoma!
Unda [zaidi] maalum index na hali WAPI au ujumuishe sehemu za ziada kwenye faharasa.
Ikiwa hali ya chujio ni "tuli" kwa madhumuni yako - yaani haimaanishi upanuzi orodha ya maadili katika siku zijazo - ni bora kutumia WHERE index. Hali mbalimbali za boolean/enum zinafaa katika kitengo hiki.
Ikiwa hali ya kuchuja inaweza kuchukua maana tofauti, basi ni bora kupanua faharisi na nyanja hizi - kama ilivyo katika BitmapAnd hapo juu.
Mfano:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, CASE
WHEN random() < 1::real/16 THEN NULL
ELSE (random() * 100)::integer -- 100 ΡΠ°Π·Π½ΡΡ Π²Π½Π΅ΡΠ½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ
END fk_own
, (random() < 1::real/50) critical; -- 1:50, ΡΡΠΎ Π·Π°ΡΠ²ΠΊΠ° "ΠΊΡΠΈΡΠΈΡΠ½Π°Ρ"
CREATE INDEX ON tbl(pk);
CREATE INDEX ON tbl(fk_own, pk);
SELECT
*
FROM
tbl
WHERE
critical
ORDER BY
pk
LIMIT 20;
Kama unaweza kuona, kuchuja kumetoweka kabisa kutoka kwa mpango, na ombi limekuwa Mara 5 kwa kasi zaidi.
#5: meza ndogo
Wakati gani
Majaribio mbalimbali ya kuunda foleni yako ya usindikaji wa kazi, wakati idadi kubwa ya sasisho / ufutaji wa rekodi kwenye meza husababisha hali ya idadi kubwa ya rekodi "zilizokufa".
Fanya kwa mikono mara kwa mara tupu [FULL] au kupata mafunzo ya mara kwa mara vya kutosha otomatiki kwa kurekebisha vyema vigezo vyake, ikiwa ni pamoja na kwa meza maalum.
Inaonekana tulisoma kidogo, na kila kitu kiliorodheshwa, na hatukuchuja mtu yeyote zaidi - lakini bado tulisoma kurasa nyingi zaidi kuliko vile tungependa.
Angalia kwa karibu muundo wa faharisi iliyotumiwa na sehemu muhimu zilizoainishwa kwenye swali - uwezekano mkubwa sehemu ya faharasa haijawekwa. Uwezekano mkubwa zaidi utalazimika kuunda faharisi inayofanana, lakini bila sehemu za kiambishi awali au jifunze kurudia maadili yao.
Kila kitu kinaonekana kuwa sawa, hata kulingana na faharisi, lakini ni ya kutiliwa shaka - kwa kila rekodi 20 zilizosomwa, tulilazimika kutoa kurasa 4 za data, 32 KB kwa rekodi - sio ujasiri? Na jina la index tbl_fk_org_fk_cli_idx ya kufikirisha.
Usindikaji wa wakati mmoja (kupanga au upekee) wa idadi kubwa ya rekodi hauingii kwenye kumbukumbu iliyotengwa kwa hili.
Jinsi ya kutambua
-> *
&& temp written > 0
Mapendekezo
Ikiwa kiasi cha kumbukumbu kinachotumiwa na operesheni haizidi sana thamani maalum ya parameter kazi_mem, inafaa kusahihisha. Unaweza mara moja katika usanidi wa kila mtu, au unaweza kupitia SET [LOCAL] kwa ombi/shughuli maalum.
Mfano:
SHOW work_mem;
-- "16MB"
SELECT
random()
FROM
generate_series(1, 1000000)
ORDER BY
1;
Kwa sababu za wazi, ikiwa kumbukumbu tu hutumiwa na sio diski, basi swala itatekelezwa kwa kasi zaidi. Wakati huo huo, sehemu ya mzigo kutoka kwa HDD pia imeondolewa.
Lakini unahitaji kuelewa kuwa hautaweza kutenga kumbukumbu nyingi kila wakati - hakutakuwa na kutosha kwa kila mtu.
#9: takwimu zisizo na maana
Wakati gani
Walimwaga mengi kwenye hifadhidata mara moja, lakini hawakuwa na wakati wa kuifukuza ANALYZE.
Jinsi ya kutambua
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& ratio >> 10
Kulikuwa na kusubiri kwa kufuli iliyowekwa na ombi shindani, au hakukuwa na rasilimali za kutosha za vifaa vya CPU/hypervisor.
Jinsi ya kutambua
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- ΡΠΈΡΠ°Π»ΠΈ ΠΌΠ°Π»ΠΎ, Π½ΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΠ»Π³ΠΎ
Mapendekezo
Tumia nje mfumo wa ufuatiliaji seva ya kuzuia au matumizi yasiyo ya kawaida ya rasilimali. Tayari tumezungumza kuhusu toleo letu la kupanga mchakato huu kwa mamia ya seva hapa ΠΈ hapa.