Aynu si qoto dheer u eegno kiisaskan - sida loo qeexay iyo waxa ay yihiin talooyin ay u horseedaan.
Si aad si fiican ugu dhex milmiso mawduuca, waxaad marka hore dhegaysan kartaa qaybta u dhiganta warbixintayda PGConf.Russia 2020, ka dibna kaliya u gudub falanqaynta faahfaahsan ee tusaale kasta:
#1: index "undersorting"
Markay soo baxdo
Tus qaansheegtii ugu dambeysay ee macmiilka "LLC Kolokolchik".
Xataa tusaalaha hore ee noocan oo kale ah - 8.5 dhakhso badan iyo 33 jeer ka yar wax la akhriyo. Inta badan "xaqiiqda" aad u leedahay qiimo kasta, ayaa sii muuqda saamaynta fk.
Waxaan ogsoonahay in tusaha noocan ahi uu u shaqayn doono sidii tusaha "horgagga" oo aan ka xumaan sidii hore ee su'aalaha kale fk, meesha kala sooc pk ma jirin mana jirin (waxaad ka akhrisan kartaa wax badan oo arrintan ku saabsan Maqaalkayga ku saabsan helitaanka tusmooyinka aan waxtarka lahayn). Marka lagu daro, waxay ku siin doontaa caadi taageero shisheeye oo cad garoonkan.
#2: isgoys index (BitmapAnd)
Markay soo baxdo
Tus dhammaan heshiisyada macmiilka "LLC Kolokolchik", oo lagu soo gabagabeeyay magaca "NAO Buttercup".
Sida loo aqoonsado
-> BitmapAnd
-> Bitmap Index Scan
-> Bitmap Index Scan
talooyinka
abuuro index ka kooban by beero ka soo jeeda labada asalka ah ama ballaariyo mid ka mid ah kuwa jira oo beero ka labaad.
Tusaale:
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); -- ΠΎΡΠ±ΠΎΡ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΠ°ΡΠ΅
Qiimaha halkan waa ka yar yahay, maadaama Bitmap Heap Scan uu iskii wax u tari karo. Laakiin si kastaba 7 dhakhso badan iyo 2.5 jeer ka yar wax la akhriyo.
#3: Isku dar tusmooyinka (BitmapOr)
Markay soo baxdo
Tus 20ka ugu da'da weyn "annaga" ama codsiyada aan la magacaabin ee habaynta, adiga oo mudnaanta leh.
Sida loo aqoonsado
-> BitmapOr
-> Bitmap Index Scan
-> Bitmap Index Scan
talooyinka
Si aad u isticmaasho UNION [ALL] in la isku daro su'aalo-hoosaadyada mid kasta oo ka mid ah OR-blocks ee shuruudaha.
Tusaale:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, CASE
WHEN random() < 1::real/16 THEN NULL -- Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ 1:16 Π·Π°ΠΏΠΈΡΡ "Π½ΠΈΡΡΡ"
ELSE (random() * 100)::integer -- 100 ΡΠ°Π·Π½ΡΡ Π²Π½Π΅ΡΠ½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ
END fk_own;
CREATE INDEX ON tbl(fk_own, pk); -- ΠΈΠ½Π΄Π΅ΠΊΡ Ρ "Π²ΡΠΎΠ΄Π΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅ΠΉ" ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ
SELECT
*
FROM
tbl
WHERE
fk_own = 1 OR -- ΡΠ²ΠΎΠΈ
fk_own IS NULL -- ... ΠΈΠ»ΠΈ "Π½ΠΈΡΡΠΈ"
ORDER BY
pk
, (fk_own = 1) DESC -- ΡΠ½Π°ΡΠ°Π»Π° "ΡΠ²ΠΎΠΈ"
LIMIT 20;
(
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, Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π½Π΅ Π½Π°Π΄ΠΎ
Abuur [dheeraad] takhasus leh index leh xaalad HALKEE ama ku dar meelo dheeraad ah tusmada.
Haddii xaaladda shaandheynta ay tahay "mid taagan" ujeedooyinkaaga - taasi waa ma tilmaamayso balaadhinta liiska qiyamka mustaqbalka - waxa fiican in la isticmaalo index WHERE. Heerarka boolean/enum ee kala duwan ayaa si fiican ugu habboon qaybtan.
Haddii xaaladda shaandhaynta waxay qaadan kartaa macnayaal kala duwan, markaa way fiicantahay in la balaadhiyo tusaha meelahan - sida xaaladda BitmapAnd kor ku xusan.
Tusaale:
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;
Sida aad arki karto, shaandhaynta ayaa gebi ahaanba ka luntay qorshaha, codsiguna wuxuu noqday 5 jeer ka dheereeya.
#5: miis yar
Markay soo baxdo
Isku dayo kala duwan oo lagu abuurayo safka habaynta hawshaada, marka tiro badan oo cusbooneysiin ah / tirtirida diiwaanada miiska u horseedo xaalad tiro badan oo diiwaano "dhintay".
Si joogto ah u samee gacanta VACUUM [FULL] ama aad ku guulaysato tababar joogto ah oo ku filan autovacuum iyadoo si fiican loo hagaajinayo cabbirkeeda, oo ay ku jiraan miis gaar ah.
U fiirso qaab dhismeedka tusaha la isticmaalay iyo meelaha muhiimka ah ee lagu sheegay weydiinta - waxay u badan tahay qayb ka mid ah tusmada lama dejin. Waxay u badan tahay inaad abuurto tusmo la mid ah, laakiin la'aanteed horgalayaasha ama baro in ay qiimeeyaan qiimahooda.
Habayn hal mar ah (kala-saarid ama kala saarid) tiro badan oo diiwaanno ah kuma habboona xusuusta loo qoondeeyay tan.
Sida loo aqoonsado
-> *
&& temp written > 0
talooyinka
Haddii qadarka xusuusta ee uu isticmaalo qalliinku aanu aad uga badanayn qiimaha la cayimay ee cabbirka shaqada_mem, waxaa mudan in la saxo. Waxaad isla markiiba u geli kartaa qaabeynta qof walba, ama waad dhex mari kartaa SET [LOCAL] codsi / macaamil gaar ah.
Tusaale:
SHOW work_mem;
-- "16MB"
SELECT
random()
FROM
generate_series(1, 1000000)
ORDER BY
1;
Sababo cad dartood, haddii xusuusta kaliya la isticmaalo oo aan diskka la isticmaalin, markaa su'aasha si dhakhso leh ayaa loo fulin doonaa. Isla mar ahaantaana, qayb ka mid ah rarka HDD sidoo kale waa la saarayaa.
Laakiin waxaad u baahan tahay inaad fahamto inaadan had iyo jeer awoodi doonin inaad qoondayso wax badan iyo xusuus badan - ma jiraan wax ku filan qof walba.
#9: tirakoob aan khusayn
Markay soo baxdo
Wax badan bay hal mar ku shubeen kaydka xogta, laakiin ma helin wakhti ay ku kaxeeyaan ANALYZE.
Sida loo aqoonsado
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& ratio >> 10
Waxaa jiray sugitaan quful ah oo lagu soo rogay codsi tartamaya, ama waxaa jiray qalab ku filan oo CPU/sareeye ah.
Sida loo aqoonsado
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- ΡΠΈΡΠ°Π»ΠΈ ΠΌΠ°Π»ΠΎ, Π½ΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΠ»Π³ΠΎ
talooyinka
Isticmaal dibadda nidaamka la socodka server-ka xannibaya ama isticmaalka kheyraadka aan caadiga ahayn. Waxaan mar hore ka hadalnay noocayaga abaabulka nidaamkan boqolaal server ah halkan ΠΈ halkan.