Hauv qhov no, txhua tus neeg tsim tawm tsis tas yuav nrhiav kev xaiv kom zoo ntawm nws tus kheej, tso siab rau nws qhov kev paub dhau los - peb tuaj yeem qhia nws tias qhov tshwm sim ntawm no, dab tsi tuaj yeem yog vim li cas, thiab yuav ua li cas mus cuag kev daws teeb meem. Qhov ntawd yog qhov peb tau ua.
Cia peb saib ze dua ntawm cov xwm txheej no - lawv txhais li cas thiab cov lus pom zoo uas lawv coj mus rau.
Txhawm rau kom nkag siab zoo dua rau koj tus kheej hauv lub ncauj lus, koj tuaj yeem ua ntej mloog cov ntawv thaiv los ntawm Kuv tsab ntawv ceeb toom ntawm PGConf.Russia 2020, thiab tsuas yog tom qab ntawd txav mus rau cov ncauj lus kom ntxaws ntawm txhua qhov piv txwv:
# 1: index "undersorting"
Thaum tshwm sim
Qhia daim ntawv them nqi kawg rau tus neeg siv khoom "LLC Kolokolchik".
-> BitmapAnd
-> Bitmap Index Scan
-> Bitmap Index Scan
tswv yim pom zoo
tsim Composite Index los ntawm cov teb los ntawm ob qho tib si thawj los yog nthuav ib qho ntawm cov uas twb muaj lawm nrog cov teb los ntawm qhov thib ob.
Piv Txwv:
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); -- ΠΎΡΠ±ΠΎΡ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΠ°ΡΠ΅
Qhov nyiaj them ntawm no yog me dua, txij li Bitmap Heap Scan tau zoo heev ntawm nws tus kheej. Txawm li cas los xij 7 npaug nrawm dua thiab 2.5 npaug tsawg dua nyeem.
#3: Merge indexes (BitmapOr)
Thaum tshwm sim
Qhia thawj 20 tus laus tshaj plaws "peb" lossis cov ntawv thov tsis tau muab rau kev ua tiav, nrog rau koj qhov tseem ceeb.
Yuav txheeb xyuas li cas
-> BitmapOr
-> Bitmap Index Scan
-> Bitmap Index Scan
tswv yim pom zoo
Siv UNION [Txhua] los ua ke subqueries rau txhua qhov OR-blocks ntawm tej yam kev mob.
Piv Txwv:
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, Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π½Π΅ Π½Π°Π΄ΠΎ
Tsim [ntxiv] tshwj xeeb index nrog qhov chaw nyob los yog suav nrog cov teb ntxiv hauv qhov ntsuas.
Yog tias lub lim dej yog "static" rau koj lub hom phiaj - yog tsis txhais hais tias expansion daim ntawv teev cov txiaj ntsig yav tom ntej - nws yog qhov zoo dua los siv qhov ntsuas qhov twg. Ntau yam boolean / enum xwm txheej haum zoo rau hauv pawg no.
Yog qhov kev lim dej tuaj yeem ua rau lub ntsiab lus sib txawv, ces nws yog qhov zoo dua los nthuav qhov Performance index nrog cov teb no - zoo li hauv qhov xwm txheej nrog BitmapAnd saum toj no.
Piv Txwv:
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;
Ua manually tsis tu ncua VACUUM [FULL] los yog ua tiav kev cob qhia tsis tu ncua txaus autovacuum los ntawm fine-tuning nws parameters, nrog rau rau ib lub rooj tshwj xeeb.
Muaj kev tos rau lub xauv yuam kev los ntawm kev thov sib tw, lossis tsis muaj peev txheej CPU / hypervisor kho vajtse.
Yuav txheeb xyuas li cas
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- ΡΠΈΡΠ°Π»ΠΈ ΠΌΠ°Π»ΠΎ, Π½ΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΠ»Π³ΠΎ
tswv yim pom zoo
Siv sab nraud saib xyuas qhov system server rau thaiv lossis siv cov peev txheej txawv txav. Peb twb tau tham txog peb version ntawm kev npaj cov txheej txheem no rau ntau pua servers S, SΡS, ΠΈ S, SΡS,.